Python中的類屬性和物件屬性
阿新 • • 發佈:2018-11-03
作者:黎智煊 ,叩丁狼高階講師。本文為原創文章,轉載請註明出處。
在瞭解了類基本的東西之後,下面看一下python中這幾個概念的區別
先來談一下類屬性
和例項屬性
在前面的例子中我們接觸到的就是例項屬性(物件屬性),顧名思義,類屬性就是類物件
所擁有的屬性,它被所有類物件
的例項物件
所共有,在記憶體中只存在一個副本,這個和C++中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件
和例項物件
訪問
類屬性
class People(object): name = 'Tom' #公有的類屬性 __age = 12 #私有的類屬性 p = People() print(p.name) #正確 print(People.name) #正確 print(p.__age) #錯誤,不能在類外通過例項物件訪問私有的類屬性 print(People.__age) #錯誤,不能在類外通過類物件訪問私有的類屬性
例項屬性(物件屬性)
class People(object): address = '山東' #類屬性 def __init__(self): self.name = 'xiaowang' #例項屬性 self.age = 20 #例項屬性 p = People() p.age =12 #例項屬性 print(p.address) #正確 print(p.name) #正確 print(p.age) #正確 print(People.address) #正確 print(People.name) #錯誤 print(People.age) #錯誤
通過例項(物件)去修改類屬性
class People(object):
country = 'china' #類屬性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) #例項屬性會遮蔽掉同名的類屬性
print(People.country)
del p.country #刪除例項屬性
print(p.country)
對於類屬性我們可以通過類名及例項物件去訪問,即:
- 類名.類屬性,
- 例項.類屬性
兩種方式訪問
屬性
-
例項屬性:
在init(self,…)中初始化
內部呼叫時都需要加上self.
外部呼叫時用例項化物件.屬性名 -
類屬性:
在init()外初始化
在內部用類名.類屬性名呼叫
外部既可以用類名.類屬性名又可以用例項化物件.類屬性名來呼叫
- 私有屬性:
- 單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改
- 雙下劃線_開頭:外部不可通過例項化物件.屬性名來訪問或者更改
實際將其轉化為了類名屬性名,只是在內部將變數名修改了,我們仍讓可以通過.類名_屬性名訪問
總結
如果需要在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,會產生一個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且之後如果通過例項物件去引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性。