python学習などclass継承、super使用と_uinit_初期化
38839 ワード
クラスの勉強、勉強init_学習とsuper方法学習 1.pythonのクラスの属性、方法学习 .クラスの例示的な方法、クラス方法、静的方法 ..クラスクラスクラスクラスクラスのアクセス制御:単線_二重線を引く .継承中の_uinit_ 5.superの詳細な使用
1.pythonの中の類の属性、方法の学習 類の私有属性:2つの下線で始まる、例えば__uprvate_atrsは、この属性がプライベートであると宣言しています.クラスの外部に使用されたり、直接にアクセスできません.クラスの内部法で使用する場合:self.u_prvate_atrs クラスの方法:一般関数の定義とは異なり、クラスの方法で定義される最初のパラメータはselfでなければならない. 類の独自の方法: メソッド名
作用
init
コンストラクタは、オブジェクトを生成するときに呼び出します.すなわち、この方法の属性を初期化します.
del
立体関数は、オブジェクトをリリースする時に使います.
…
…
参照特殊なクラス属性:すべてのクラスについて 属性名
意味
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によってインスタンスの属性に直接アクセスすることができる: 種類の方法 種類の方法では、クラス自体をclsを最初のパラメータとし、定義時に@classimethod装飾器を使用します.クラスの関連属性 には、clsによりアクセスできます.種類の静的方法 種類の静的方法は、パラメータの制限がない、すなわち、インスタンスパラメータが必要ではない、クラスパラメータも必要ではない、定義の際に@staticmethod装飾器の同種の方法を使用するのと同様に、静的方法は類名でアクセスすることができ、インスタンスを通じてアクセスすることができる. は、pythonにおいて、単線アンダースコアによりモジュールレベルの私有化を実現し、変数を除く.単線で始まる関数をモジュールとして私有すると約束されています.つまり、from modulename import*は単線で始まる関数 を導入しません.は、pythonにおけるクラスの属性に対して、二重下線を引くことができる.ある程度の私有化を実現します.二重下線の先頭の属性は、運転時に「混同」されるためです. 二二重線のもう一つの用途:親の同名属性に対するサブクラスの衝突を避ける.
Pythonで相続が現れる場合の注意点は、初期化関数__u uinit_の挙動: 自分の初期化関数がサブクラスに定義されていない場合、親クラスの初期化はデフォルトで呼び出されますが、インスタンス化子タイプのオブジェクトを望むなら、親タイプの初期化関数に対応するパラメータしか入力できません.そうでなければエラーが発生します. サブクラスは自分の初期化関数を定義していますが、サブクラスには親タイプを呼び出す初期化関数が表示されていない場合、親タイプの属性は初期化されません. サブクラスが自分の初期化関数を定義すると、親クラスの呼び出しが表示され、サブクラスと親クラスの属性が初期化されます. superは、主に親の方法を呼び出して親のクラスを表示するために用いられ、サブクラスでは一般的に親と同じ属性、方法、などを定義し、サブクラス特有の挙動を実現する.つまり、子は親のクラスを継承しますので、属性と方法は、子は親の同名の属性と方法をカバーすることもできます.
1.参考2.参考
1.pythonの中の類の属性、方法の学習
作用
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
クラスが属するモジュール
クラス
クラスのオブジェクトの種類
可変タイプのクラス属性(リストなど)に対して、隠し属性をまとめました.
実例化によってクラスの属性にアクセスすることができますが、クラス名でクラスの属性にアクセスすることで、属性が隠れてくる不要なトラブルを回避することができます.
2.クラスの例示的な方法、クラスの方法、静的な方法
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
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() #
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.クラスクラスクラスクラスクラスのアクセス制御:単線_二重線を引く_tall=180 #
def _call_for(): #
print('_tall',——tall)
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の詳細使用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 value1.参考2.参考