2010-05-27 82 views
13

我有一個關於python中的class屬性的問題。python class屬性

class base : 
    def __init__ (self): 
     pass 
    derived_val = 1 

t1 = base() 
t2 = base() 

t2.derived_val +=1 
t2.__class__.derived_val +=2 
print t2.derived_val    # its value is 2 
print t2.__class__.derived_val # its value is 3 

結果是不同的。我也使用id()函數來查找t2.derived_val和t2。 .derived_val具有不同的內存地址。 我的問題是derived_val是類的屬性。爲什麼在上面的例子中有所不同? 是因爲類的實例在類屬性旁邊複製自己的derived_val?

回答

34

有類屬性和實例屬性。 當你說

class base : 
    derived_val = 1 

你要定義一個類屬性。 derived_val成爲 base.__dict__中的關鍵。

t2=base() 
print(base.__dict__) 
# {'derived_val': 1, '__module__': '__main__', '__doc__': None} 
print(t2.__dict__) 
# {} 

當你說t2.derived_val的Python試圖找到 'derived_val' 在t2.__dict__。由於它不在那裏,它看起來t2的任何基類中是否有'derived_val'密鑰。

print(t2.derived_val) 
print(t2.__dict__) 
# 1 
# {} 

但是當你分配一個值t2.derived_val,你現在添加實例屬性t2。將derived_val密鑰添加到t2.__dict__

t2.derived_val = t2.derived_val+1 
print(t2.derived_val) 
print(t2.__dict__) 
# 2 
# {'derived_val': 2} 

注意,在這一點上,有兩個derived_val屬性,但只有 實例屬性也很方便。班級屬性只能通過參考base.derived_val或直接訪問課程代碼base.__dict__才能訪問。

2

檢查出herehere

__class__屬性是對象所屬的類。所以在你的例子中,情況類似於靜態變量。 t2.__class__.derived_val指的是屬於該類的變量,而不是屬於t2的變量。

1

另一種方式(可能是一個更簡潔的一個),以證明這一點:

class A(): 
    a1 = [] 
x = A() 
y = A() 
x.a1.append("test") 
x.a1, y.a1 
(['test'], ['test']) 

class B(): 
    b1 = None 
    def __init__(self): 
     self.b1 = list() 
r = B() 
s = B() 
r.b1.append("test") 
r.b1, s.b1 
(["test"], []) 
相關問題