python学習などclass継承、super使用と_uinit_初期化


クラスの勉強、勉強init_学習とsuper方法学習
  • 1.pythonのクラスの属性、方法学习
  • .クラスの例示的な方法、クラス方法、静的方法
  • .
  • .クラスクラスクラスクラスクラスのアクセス制御:単線_二重線を引く
  • .継承中の_uinit_
  • 5.superの詳細な使用
    1.pythonの中の類の属性、方法の学習
  • 類の私有属性:2つの下線で始まる、例えば__uprvate_atrsは、この属性がプライベートであると宣言しています.クラスの外部に使用されたり、直接にアクセスできません.クラスの内部法で使用する場合:self.u_prvate_atrs
  • クラスの方法:一般関数の定義とは異なり、クラスの方法で定義される最初のパラメータはselfでなければならない.
  • 類の独自の方法:
  • メソッド名
    作用
    init
    コンストラクタは、オブジェクトを生成するときに呼び出します.すなわち、この方法の属性を初期化します.
    del
    立体関数は、オブジェクトをリリースする時に使います.


    参照
    class person(object):
    	tall=180
    	hobbies=[]
    	def __init__(self,name,age,weight):
    		self.name=name
    		self.age=age
    		self.weight=weight
    	def information(self):
    		print("%s age is %d ,and weigth is %s"%(self.name,self.age,self.weight))
    
    person.hobbies.extend(["football","woman"]) #          ,             ,       
    print("person hobbies list is:%s"%person.hobbies)
    person.hobbies2=["reading","swimming","running"] #     ,          ,                  
    print("person hobbies2 list is:%s"%person.hobbies2)
    print(dir(person)) #      dir()         __dict__              
    
    jhon=person("jhon",24,66) #               
    jhon.gender="man"  #             ,         jhon  
    print("%s gender is %s"%(jhon.name,jhon.gender))
    print(dir(jhon))
    jhon.hobbies.append("python") #         ,       
    infoma=jhon.information()
    print(infoma)
    print(jhon.hobbies)
    
    jhon2=person("jhon2",25,68) #jhon2     gender
    print(jhon2.__dir__())
    
  • 特殊なクラス属性:すべてのクラスについて
  • 属性名
    意味
    name
    クラスの名前
    doc
    クラスの文書文字列
    bases
    クラスのすべての親からなるグループ
    プロジェクト
    クラスの属性からなる辞書
    module
    クラスが属するモジュール
    クラス
    クラスのオブジェクトの種類
  • 類の隠し属性(可変タイプのクラス属性)
  • 可変タイプのクラス属性は、インスタンスjhonを通じてアクセスできます.person.tallの値はjhone.tallの値です.
  • 例によって属性が賦課されたり修正されたりすると、インスタンスjhonのためにtallのインスタンス属性が新たに作成されます.person.tallはjhone.tallに等しくないです.
  • .del jhon.tall文でインスタンスtallの属性を削除した後、再びとなる:person.tallはjhone.tall
  • である.
    可変タイプのクラス属性(リストなど)に対して、隠し属性をまとめました.
  • も可変タイプのクラス属性person.hobriesについては、インスタンスBruceを介してアクセスでき、「person.hobries is Bruce.hobries」
  • .インスタンスを通してHobries属性を付与すると、いずれもインスタンスBruceのためにHobriesの実例的な属性を新設する.このとき、「person.hobries is not Bruce.hobries」
  • .
  • 「del Bruce.hobries」文によりインスタンスのhobries属性を削除した後、再び「person.hobris Bruce.hobries」
  • になる.
  • HObries属性を例によって修正すると、Bruce.hobriesが指すメモリアドレス(すなわち、person.hobries)が変更され、この「person.hobries is not Bruce.hobries」
  • .
    実例化によってクラスの属性にアクセスすることができますが、クラス名でクラスの属性にアクセスすることで、属性が隠れてくる不要なトラブルを回避することができます.
    2.クラスの例示的な方法、クラスの方法、静的な方法
  • 例示的な方法例の方法の最初のパラメータはselfである必要があり、例示的な方法は、クラスのインスタンス化によってのみ呼び出され、このクラス自体を表すselfである.selfによってインスタンスの属性に直接アクセスすることができる:
  • class person(object):
    	tall=180
    	hobbies=[]
    	def __init__(self,name,age,weight): #__init__      ,    ,        
    		self.name=name
    		self.age=age
    		self.weight=weight
    	def infoma(self): #    ,          
    		print('%s is age %s weights %s'%(self.name,self.age,self.weight))
    jhon=person("jhon",24,175)
    jhon.infoma()
      :
    jhon is age 24 weights 175
    
  • 種類の方法
  • 種類の方法では、クラス自体をclsを最初のパラメータとし、定義時に@classimethod装飾器を使用します.クラスの関連属性
  • には、clsによりアクセスできます.
    class person(object):
        tall = 180
        hobbies = []
        def __init__(self, name, age,weight):
            self.name = name
            self.age = age
            self.weight = weight
        @classmethod #     
        def infoma(cls): #cls     ,     cls
            print(cls.__name__)
            print(dir(cls))
    #cls     
    person.infoma() #           ,  cls          
    jhon=person("jhon",24,170) #            ,      person
    jhon.infoma() #     
    
  • 種類の静的方法
  • 種類の静的方法は、パラメータの制限がない、すなわち、インスタンスパラメータが必要ではない、クラスパラメータも必要ではない、定義の際に@staticmethod装飾器の同種の方法を使用するのと同様に、静的方法は類名でアクセスすることができ、インスタンスを通じてアクセスすることができる.
  • class person(object):
    
       tall = 180
       hobbies = []
       def __init__(self, name, age,weight):
           self.name = name
           self.age = age
           self.weight = weight
       @staticmethod    #       
       def infoma():     #      ,       ,      
           print(person.tall)
           print(person.hobbies)
    #person.infoma()   #           
    Bruce = person("Bruce", 25,180)   #      
    Bruce.infoma() 
    
    3.クラスクラスクラスクラスクラスのアクセス制御:単線_二重線を引く
  • は、pythonにおいて、単線アンダースコアによりモジュールレベルの私有化を実現し、変数を除く.単線で始まる関数をモジュールとして私有すると約束されています.つまり、from modulename import*は単線で始まる関数
  • を導入しません.
    _tall=180  #        
    def _call_for(): #         
    	print('_tall',——tall)
    
  • は、pythonにおけるクラスの属性に対して、二重下線を引くことができる.ある程度の私有化を実現します.二重下線の先頭の属性は、運転時に「混同」されるためです.
    class person(object):
        
        tall = 180
        hobbies = []
        def __init__(self, name, age,weight):
            self.name = name
            self.age = age
            self.weight = weight
            self.__Id = 430 #  __id        
        @staticmethod
        def infoma():
            print(person.tall)
            print(person.hobbies)
    #person.infoma()
    jhon = person("jhon", 25,180)
    #print(Bruce.__Id)#  
    #jhon.infoma() 
    #      dir()  __Id      ,      _person__Id
    print(dir(jhon))
    print(jhon._person__Id)
    
  • 二二重線のもう一つの用途:親の同名属性に対するサブクラスの衝突を避ける.
    class A(object):
    	def __init__(self):
    		self.__private()#       self._A__private()
    		self.public()
    	def __private(self): #        ,      
    		print('A.__private()')
    	def public(self):
    		print('A.public()')
    class B(A):
    	def __private(self): #
    		print('B.__private()')
    	def public(self):
    		print('B.public()')
    b=B() # B    ,      __init__  ,       __init__,         '  '  ,"self.__private()"   self._A__private()
      :
    A.__private()
    B.public()
    
    class A(object):
    	def __init__(self):
    		self.private()
    		self.public()
    	def private(self): 
    		print('A.private()')
    	def public(self):
    		print('A.public()')
    class B(A):
    	def private(self): #
    		print('B.private()')
    	def public(self):
    		print('B.public()')
    b=B() 
      :
    B.private()
    B.public()
    
    4.継承中の_u u uinit_
    Pythonで相続が現れる場合の注意点は、初期化関数__u uinit_の挙動:
  • 自分の初期化関数がサブクラスに定義されていない場合、親クラスの初期化はデフォルトで呼び出されますが、インスタンス化子タイプのオブジェクトを望むなら、親タイプの初期化関数に対応するパラメータしか入力できません.そうでなければエラーが発生します.
  • #      parent
    class Parent(object):
    	def __init__(self,name):
    		self.name=name
    		print("create an instance of:",self.__class__.name__)  #self.__class__.__name__            
    		print("name attribute is:",self.name)
    	
    #define subChild class ,    :
    class Child(Parent):
    	pass
    #      ,         ,                ,            
    c=Child("init Child")
      :
    create an instance of: Child
    name attribute is: init Child
    
  • サブクラスは自分の初期化関数を定義していますが、サブクラスには親タイプを呼び出す初期化関数が表示されていない場合、親タイプの属性は初期化されません.
    class Parent(object):
    	def __init__(self,name):
    		self.name=name
    		print("create an instance of: ",self.__class__.__name__)
    		print("name attribute is:",self.name)
    #      
    class Child(Parent):
    	#                 
    	def __init__(self):
    		print("call__init__ form Child class")
    	#     
    c=Child()
    print(c.name)	 #    ,          
    
  • サブクラスが自分の初期化関数を定義すると、親クラスの呼び出しが表示され、サブクラスと親クラスの属性が初期化されます.
    class Parent(object):
        def __init__(self, name):
            self.name = name
            print("create an instance of:", self.__class__.__name__)
            print("name attribute is:", self.name)
    class Child(Parent):
    	def __init__(self):
    		print("call__init__form Child class")
    		super(Child,self).__init__("data from Child")  #    child self    
    d=Parent('jhon')
    c=Child()
    print(c.name)
        :
    create an instance of: Parent
    name attribute is: jhon
    call__init__form Child class
    create an instance of: Child
    name attribute is: data from Child
    data from Child
    
    5.superの詳細使用
  • superは、主に親の方法を呼び出して親のクラスを表示するために用いられ、サブクラスでは一般的に親と同じ属性、方法、などを定義し、サブクラス特有の挙動を実現する.つまり、子は親のクラスを継承しますので、属性と方法は、子は親の同名の属性と方法をカバーすることもできます.
    class Parent(object):
    	Value="from parent value"
    	def fun(self):
    		print("function is from Parent")
    #    ,    
    class Child(Parent):
    	Value ="from child value"
    	def fun(self):
    		print("funtion is from child")
    		Parent.fun(self) #     fun    , self       
    c=Child()
    c.fun()
    print(Child.Value)
    
    上の親の欠点を継承します.親の名前を通して、子のクラスに無理に符号化する必要がありますが、super方法はこの問題を解決できます.
    class Parent(object):
       Value="from parent value"
       def fun(self):
       	print("function is from Parent")
    #    ,    
    class Child(Parent):
       Value ="from child value"
       def fun(self):
       	print("funtion is from child")
       	#Parent.fun(self) #     fun    , self       
       	super(Child,self).fun() #              
    c=Child()
    c.fun()
    print(Child.Value)
    
    出力:funtion is from child function is from Part from child value
    1.参考2.参考