放假歸來 ~~~
一、概念
- 類物件:類名
- 例項物件:通過類建立的物件
- 類屬性:類物件所擁有的屬性。歸類所有,被類物件和例項物件所共有。
類的公有屬性可以在類外被訪問。 - 例項屬性:例項物件所特有的屬性,類物件不能擁有,即不能通過類物件呼叫。
例項屬性可以放在構造方法__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型別,情況又會有點不一樣了。例如:
當類屬性為可變物件時,通過例項物件來修改類屬性時,會修改類屬性,且在刪除例項屬性時會報錯。
所以,使用類物件來修改類屬性,不要使用例項物件來修改類屬性。
❤ thanks for watching, keep on updating...
點個贊再走吧