如果我在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