1、類屬性與實例屬性 類屬性就相當與全局變數,實例對象共有的屬性,實例對象的屬性為實例對象自己私有。 類屬性就是類對象(Tool)所擁有的屬性,它被所有類對象的實例對象(實例方法)所共有,在記憶體中只存在一個副本,這個和C++中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類對象和實例對象 ...
1、類屬性與實例屬性
類屬性就相當與全局變數,實例對象共有的屬性,實例對象的屬性為實例對象自己私有。
類屬性就是類對象(Tool)所擁有的屬性,它被所有類對象的實例對象(實例方法)所共有,在記憶體中只存在一個副本,這個和C++中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類對象和實例對象訪問。
2、實例:類屬性
1 class People(object): 2 name = 'Jack' #類屬性(公有) 3 __age = 12 #類屬性(私有) 4 5 p = People() #創建實例對象 6 7 print(p.name) #通過實例對象,列印類屬性:name 8 print(People.name) #通過類對象,列印類屬性:name 9 print(p.__age) #錯誤,不能在類外通過實例對象訪問私有的類屬性 10 print(People.__age) #錯誤,不能在類外通過類對象訪問私有的類屬性 11 12 #結果如下: 13 # Jack 14 # Jack 15 # AttributeError: 'People' object has no attribute '__age' 16 # AttributeError: type object 'People' has no attribute '__age'
3、實例:實例屬性(對象屬性)
1 class People(object): 2 address = '山東' # 類屬性 3 def __init__(self): 4 self.name = 'xiaowang' # 實例屬性 5 self.age = 20 # 實例屬性 6 7 p = People() #創建實例對象 8 p.age = 12 # 通過實例對象調用實例屬性,更改實例屬性值 9 print(p.address) # 通過實例對象調用類屬性,並列印 10 print(p.name) # 通過實例對象調用實例屬性,並列印 11 print(p.age) # 通過實例對象調用實例屬性,並列印 12 13 #結果: 14 # 山東 15 # xiaowang 16 # 12 17 18 print(People.address) # 通過類對象調用類屬性,並列印 19 print(People.name) # 錯誤(程式會報錯),通過類對象調用實例屬性,並列印 20 print(People.age) # 錯誤(程式會報錯),通過類對象調用實例屬性,並列印 21 22 #結果: 23 # 山東 24 # AttributeError: type object 'People' has no attribute 'name' 25 # AttributeError: type object 'People' has no attribute 'age'
4、通過實例(對象)去修改類屬性
1 class People(object): 2 country = 'china' # 類屬性 3 4 print(People.country) #china 5 p = People() 6 print(p.country) #china 7 p.country = 'japan' 8 print(p.country) # 實例屬性會屏蔽掉同名的類屬性:japan 9 print(People.country) #china 10 del p.country # 刪除實例屬性 11 print(p.country) #實例屬性被刪除後,再調用同名稱的屬性,會調用類屬性:china
小結:
如果需要在類外修改類屬性
,必須通過類對象
去引用然後進行修改。如果通過實例對象去引用,會產生一個同名的實例屬性
,這種方式修改的是實例屬性
,不會影響到類屬性
,並且之後如果通過實例對象去引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性
,除非刪除了該實例屬性
。