Python 類的屬性與實例屬性

放假歸來 ~~~spa


1、概念

  • 類對象:類名
  • 實例對象:經過類建立的對象
  • 類屬性:類對象所擁有的屬性。歸類全部,被類對象和實例對象所共有。
    類的公有屬性能夠在類外被訪問。
  • 實例屬性:實例對象所特有的屬性,類對象不能擁有,即不能經過類對象調用。
    實例屬性能夠放在構造方法__init__()中,也能夠在建立實例對象後,進行綁定。

2、舉例說明

咱們經過建立一個學生類來進行說明。code

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,當類屬性和實例屬性相同且混用的時候,會出現點問題。
咱們先經過類來修改類的數據屬性。修改後,類和實例對象都可訪問。ip

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

再經過類實例對象來修改類屬性:it

>>>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就能夠從新訪問類數據屬性了。io

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

因此,實例屬性和類屬性不要使用相同的名字。由於相同名稱的實例屬性將屏蔽掉類屬性。class

能夠經過實例綁定、訪問實例的屬性,舉例說明:cli

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

可是,可是,可是,當類數據屬性爲可變對象時,好比dict類型,狀況又會有點不同了。例如:object

clipboard.png

當類屬性爲可變對象時,經過實例對象來修改類屬性時,會修改類屬性,且在刪除實例屬性時會報錯。
因此,使用類對象來修改類屬性,不要使用實例對象來修改類屬性。date


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

相關文章
相關標籤/搜索