1. 程式人生 > >Python中的類屬性和物件屬性

Python中的類屬性和物件屬性

作者:黎智煊 ,叩丁狼高階講師。本文為原創文章,轉載請註明出處。  

 

在瞭解了類基本的東西之後,下面看一下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()外初始化
在內部用類名.類屬性名呼叫
外部既可以用類名.類屬性名又可以用例項化物件.類屬性名來呼叫

  • 私有屬性:
    • 單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改
    • 雙下劃線_開頭:外部不可通過例項化物件.屬性名來訪問或者更改
         
      實際將其轉化為了
      類名屬性名,只是在內部將變數名修改了,我們仍讓可以通過.類名_屬性名訪問

總結

如果需要在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,會產生一個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且之後如果通過例項物件去引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性。