放假歸來 ~~~spa
__init__()
中,也能夠在建立實例對象後,進行綁定。咱們經過建立一個學生類來進行說明。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
當類屬性爲可變對象時,經過實例對象來修改類屬性時,會修改類屬性,且在刪除實例屬性時會報錯。
因此,使用類對象來修改類屬性,不要使用實例對象來修改類屬性。date
❤ thanks for watching, keep on updating...
點個贊再走吧