一、實(shí)例屬性
1、實(shí)例屬性是類實(shí)例化之后才會擁有的屬性;
2、實(shí)例屬性一般在__init__方法中創(chuàng)建,__init__方法在類實(shí)例化的時候被調(diào)用;
3、定義形式為:self.<屬性名>,引用方法為:self.<屬性名>(self代表類的實(shí)例本身);
4、在類外引用或者定義:實(shí)例名.屬性名;
5、相同類的不同實(shí)例其實(shí)例屬性是不相關(guān)的;
6、不建議在__init__方法之外創(chuàng)建和初始化實(shí)例屬性;
7、不推薦在類外定義或者修改。
舉例,分別對上面幾點(diǎn)進(jìn)行說明
class A:
def __init__(self):
self.aa = 1
self.bb = 2
def info(self):
print("self.aa:",self.aa,"self.bb:",self.bb)
if __name__ == "__main__":
a = A()#將類實(shí)例化,會調(diào)用__init__構(gòu)造方法,創(chuàng)建實(shí)例屬性self.aa,self.bb
a.info()
print(a.aa)#類外訪問
print(a.bb)
b = A()#再實(shí)例化一個對象B
b.aa = 3#類外重新定義
a.info()
b.info()
print(a.aa)
print(b.aa)
a.cc = 6#類外定義實(shí)例屬性(一般不這樣做)
print(a.cc)
輸出為:
self.aa: 1 self.bb: 2
1
2
self.aa: 1 self.bb: 2
self.aa: 3 self.bb: 2
1
3
程序的大概構(gòu)造是:創(chuàng)建了一個類A,在__init__構(gòu)造方法中定義了兩個實(shí)例屬性aa和bb;info方法輸出這兩個實(shí)例屬性。
主程序部分: 實(shí)例化了一個對象a;然后使用:“實(shí)例名. 方法名”的形式調(diào)用了實(shí)例方法info;a.aa是使用“實(shí)例名.屬性名”的形式訪問實(shí)例屬性aa;接著又實(shí)例化了一個對象b,然后在類外使用“實(shí)例名.屬性名”的形式重新定義了實(shí)例屬性aa;然后調(diào)用兩個實(shí)例化對象的info方法以及輸出這兩個實(shí)例化對象的實(shí)例屬性。
程序輸出部分可以看到,使用b.aa = 3在類外重新定義了實(shí)例屬性之后,并沒有影響實(shí)例a的實(shí)例屬性(a.info()的輸出還是1,2),所以相同類的不同實(shí)例其實(shí)例屬性是不相關(guān)的。
二、類屬性
1、類定義后就存在的屬性,不需要實(shí)例化
2、相同類的不同實(shí)例可以公用類屬性
3、類屬性被改變時,作用范圍是所有類的實(shí)例
4、訪問方法:可以通過“類名.類屬性名”的方法訪問;也可以使用“實(shí)例名.類屬性名”的方法訪問(需要先實(shí)例化)
class A:
cc = 0#類屬性
def __init__(self):
self.aa = 1
self.bb = 2
def info(self):
print("self.aa:",self.aa,"self.bb:",self.bb,"cc:",A.cc)
if __name__ == "__main__":
a = A()#實(shí)例化一個對象a
a.info()#調(diào)用實(shí)例方法
print(A.cc)#直接使用類名.類屬性名的方式訪問
print(a.cc)#使用實(shí)例名.類屬性名的方式訪問
A.cc = 6#類外重新定義類屬性
b = A()#實(shí)例化一個對象b
a.info()#類屬性改變對a實(shí)例生效
b.info()#類屬性改變對b實(shí)例也生效
輸出為:
self.aa: 1 self.bb: 2 cc: 0
0
0
self.aa: 1 self.bb: 2 cc: 6
self.aa: 1 self.bb: 2 cc: 6
三、私有屬性(非強(qiáng)制性)
1、使用__(雙下劃線)開頭的屬性
2、使用_(單下劃線)開頭的屬性
要注意的是:python語言并沒有對這些屬性設(shè)定強(qiáng)制性的訪問限制,這些定義屬性的定義方式,只是名義上的限制而非強(qiáng)制性。
雙下劃線開頭的屬性:
class A:
def __init__(self):
self.__ab = 0#定義私有屬性__ab
def info(self):
print(self.__ab)#類的內(nèi)部訪問
if __name__ == "__main__":
a = A()
a.info()
# print(a.__ab)#報錯,類外不能訪問
print(a._A__ab)#類外可以通過這種形式訪問
輸出為:
0
0
單下劃線開頭的屬性:
class A:
def __init__(self):
self._ab = 0#定義私有屬性__ab
def info(self):
print(self._ab)#類的內(nèi)部訪問
if __name__ == "__main__":
a = A()
a.info()
print(a._ab)#類外可以訪問
a._ab = 1#類外改變屬性值
a.info()
print(a._ab)
輸出為:
0
0
1
1
單下劃線開頭的屬性類外可以訪問以及修改