python的類屬性問題

2021-07-23 22:57:06 字數 1826 閱讀 9287

在python的類中,如果在類定義的時候,直接在類中定義屬性(而不是在類的各種方法中)並賦值定義的,就是類屬性。類屬性為每乙個例項都有的屬性,而且對類屬性的更改也會改變所有例項的該屬性。

實際上,把類看作乙個函式,類屬性就是該函式中的函式內全域性變數。

class person(object):

address = 'earth'

def __init__(self, name):

self.name = name

該類所生成的任何例項,address屬性都是earth

因為類屬性是直接繫結在類上的,所以,訪問類屬性不需要建立例項,就可以直接訪問:

print person.address

# => earth

對乙個例項呼叫類的屬性也是可以訪問的,所有例項都可以訪問到它所屬的類的屬性:

p1 = person('bob')

p2 = person('alice')

print p1.address

# => earth

print p2.address

# => earth

由於python是動態語言,類屬性也是可以動態新增和修改的:

person.address = 'china'

print p1.address

# => 'china'

print p2.address

# => 'china'

因為類屬性只有乙份,所以,當person類的address改變時,所有例項訪問到的類屬性都改變了。

然而,經測試,

class game(object):

type='football'

def __init__(self,**kw):

for i,k in kw.iteritems():

setattr(self,i,k)

g1=game(name='baca',level=1)

g2=game(name='real marid',level=1)

g3=game(name='real marid',level=1,type='table ball')

g1.type='basketball'

print g1.type

print g2.type

print g3.type

print game.type

game.type='no ball'

print 'after change game.type:'

print g1.type

print g2.type

print g3.type

print game.type

顯示結果為:

basketball

football

table ball

football

after change game.type:

basketball

no ball

table ball

no ball

所以,當例項物件引用該類的類屬性時,如果該例項物件沒有重新被繫結該屬性,則引用的是類的屬性(會隨著類屬性的變動而變動),而當該例項物件重新被定義了同名的屬性的時候,即成為了該例項自己的屬性,不隨類屬性的變動而變動。

當訪問 例項物件的屬性,優先查詢例項屬性,若

沒有例項屬性,則查詢類屬性,若還是沒有,則提示屬性不存在。

可見,當例項屬性和類屬性重名時,例項屬性優先順序高,它將遮蔽掉對類屬性的訪問。

lombok子類繼承父類屬性問題

我們知道 data註解在類,為類的所有字段註解 tostring equalsandhashcode getter的便捷方法,同時為所有非final欄位註解 setter。要注意 equalsandhashcode註解與 tostring註解預設情況下是忽略父類的成員變數的,測試 如下 data n...

python 類屬性 用處 Python類屬性詳解

類屬性1.類定義後就存在,而且不需要例項化 2.類屬性使得相同類的不同例項共同持有相同變數 類屬性例項 attrb.py class testcss cssa class attribe def init self self.a 0 self.b 10 def info self print a s...

python限定類屬性的類屬性 slots

slots 由於python是動態語言,任何例項在執行期都可以動態地新增屬性。如果要限制新增的屬性,例如,student類只允許新增 name gender和score 這3個屬性,就可以利用python的乙個特殊的 slots 來實現。顧名思義,slots 是指乙個類允許的屬性列表 class s...