如果我在Python中創建一個類,我給它一個類屬性(這是直接取自文檔,here),作爲從實例修改類屬性,根據類型不同的行爲?
class Dog:
tricks = []
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
我看到的是,作爲文檔建議,在做的時候
d1 = Dog('d1')
d2 = Dog('d2')
d1.add_trick('trick')
print d2.tricks
我得到的伎倆被添加到D2,以及:
['trick']
這是因爲tricks
是一個類屬性,而不是一個插件tance屬性在所有實例中共享(如果這不是正統的話,請糾正我)。
現在,假設我這樣做,而不是
class Dog:
a = 1
def __init__(self, name):
self.name = name
def improve_a(self):
self.a += 1
,我跑
d1 = Dog('d1')
d2 = Dog('d2')
d1.improve_a()
print d1.a, d2.a
這分別給了我2和1,即二審計數並沒有改變。爲什麼這是行爲差異?
'self.a + = 1'確實執行爲'self.a = self.a + 1' ... – deceze
因爲在一種情況下,您正在變更所有實例共享的可變類屬性(http:///stackoverflow.com/q/1680528/3001761),另一方面,你使用不可變的實例屬性來映射不可變的類屬性。他們的情況並非如此。 *「取決於類型的不同行爲」*正是您應該期望的,否則OOP中的事情確實很無聊! – jonrsharpe