Python 類的屬性與例項屬性

weixin_33763244發表於2018-10-11

放假歸來 ~~~


一、概念

  • 類物件:類名
  • 例項物件:通過類建立的物件
  • 類屬性:類物件所擁有的屬性。歸類所有,被類物件和例項物件所共有。
    類的公有屬性可以在類外被訪問。
  • 例項屬性:例項物件所特有的屬性,類物件不能擁有,即不能通過類物件呼叫。
    例項屬性可以放在構造方法__init__()中,也可以在建立例項物件後,進行繫結。

二、舉例說明

我們通過建立一個學生類來進行說明。

class Student1(object):
    version = 1.0                        # 類的公有資料屬性
    __v = 66                            # 類的私有資料屬性
    
    # 構造方法裡的例項屬性,在類建立例項時自動被呼叫
    def __init__(self ,name,score):        
        self.name = name 
        self.score = score 
    
    # 類的方法屬性,通過類例項化物件訪問
    def updateScore(self,new_score):    
        self.score = new_score

then,嘗試通過類物件和例項物件來訪問類的公有資料屬性。對於例項沒有而類有的屬性,會繼續查詢類的屬性。

>>> b = Student1('xlp','100')   
>>> Student1.version            # 通過類來訪問類的資料屬性
1.0
>>> b.version                    # 通過類例項訪問類的資料屬性,列印version屬性 
1.0                    # 因為例項並沒有該屬性,所以會繼續查詢class的version屬性 

but,當類屬性和例項屬性相同且混用的時候,會出現點問題。
我們先通過類來修改類的資料屬性。修改後,類和例項物件均可訪問。

>>>Student1.version += 0.1    
>>>Student1.version         # 或者b.version
1.1

再通過類例項物件來修改類屬性:

>>>b.version += 0.1            # 試圖通過類物件來修改類屬性
>>>b.version                # 效果等同於b.version = Student.version + 0.1
1.2                 # 由於例項屬性優先順序高於類屬性,因此會遮蔽掉類的version屬性 1.1
>>>Student1.version 
1.1                 # 此時Student.version仍為1.1

其實,在上面例項物件修改類資料屬性時,建立了一個名為version的新例項屬性,覆蓋了類屬性的引用。
但是類本身的資料屬性沒有受到影響,仍存在類域中,可以通過類屬性訪問。
如果將b.version屬性進行刪除del,之後b.version就可以重新訪問類資料屬性了。

>>>del b.version            # 刪除例項屬性
>>>b.version             # 由於例項的version屬性沒有找到,類的屬性就顯示出來了
1.1

所以,例項屬性和類屬性不要使用相同的名字。因為相同名稱的例項屬性將遮蔽掉類屬性。

可以通過例項繫結、訪問例項的屬性,舉例說明:

>>> b.name                    
'xlp'
>>>b.updateSocore(100)        # 通過例項訪問類方法屬性
>>>b.score
100

但是,但是,但是,當類資料屬性為可變物件時,比如dict型別,情況又會有點不一樣了。例如:

clipboard.png

當類屬性為可變物件時,通過例項物件來修改類屬性時,會修改類屬性,且在刪除例項屬性時會報錯。
所以,使用類物件來修改類屬性,不要使用例項物件來修改類屬性。


❤ thanks for watching, keep on updating...
點個贊再走吧

相關文章