面向物件--類屬性和例項屬性
阿新 • • 發佈:2020-09-14
類屬性和例項屬性
在瞭解了類基本的東西之後,下面看一下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)
總結
- 如果需要在類外修改
類屬性
,必須通過類物件
去引用然後進行修改。如果通過例項物件去引用,會產生一個同名的例項屬性
,這種方式修改的是例項屬性
類屬性
,並且之後如果通過例項物件去引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性
,除非刪除了該例項屬性
。