Python面向?qū)ο螅ㄒ唬簩ο蟮奶卣鳎▽?shí)例屬性,類屬性,私有屬性)

一、實(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

單下劃線開頭的屬性類外可以訪問以及修改

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容