在完成python tutorial on classes时,它描述了类和实例变量。我的问题是:在下面的例子中,为什么'kind'表现得像一个实例变量,即使它被声明(至少它的位置是一个类变量?
我按照教程示例将狗类定义为
class Dog:
kind = 'canine' # class variable shared by all instances
tricks = []
def __init__(self, name):
self.name = name # instance variable unique to each instance
然后我创建了两个实例并打印出变量
d = Dog('Fido')
e = Dog('Buddy')
print('After initialize instances: {!s:<8}{!s:<10}{!s:<}'.format(d.name, d.kind, d.tricks))
print('After initialize instances: {!s:<8}{!s:<10}{!s:<}\n'.format(e.name, e.kind, e.tricks))
并收到了预期的产量。
After initialize instances: Fido canine []
After initialize instances: Buddy canine []
然后我用
附加fido技巧d.tricks.append('roll over')
并获得类似打印语句的预期输出:
After append roll over to Fido: Fido canine ['roll over']
After append roll over to Fido: Buddy canine ['roll over']
我理解为什么巴迪也会“翻身”。技巧是一个类变量。我不明白的是然后我将fido.kind设置为cat with
d.kind = 'cat'
仅更改实例'd'的值。模拟打印语句给出:
After set Fido kind to cat: Fido cat ['roll over']
After set Fido kind to cat: Buddy canine ['roll over']
为什么实例'e'或Buddy的类型仍然是犬?
最后,我将技巧设置为列表而不是附加,并且它只更改了'd'或'Fido'返回的结果。换句话说:
d.tricks = ['play dead', 'roll over']
类似的印刷语句给出:
After set Fido tricks to list: Fido cat ['play dead', 'roll over']
After set Fido tricks to list: Buddy canine ['roll over']
我知道类似的问题是here,here和here(仅举几例)。但我仍然没有得到它。我认为我的误解与mutable个对象以及idenity设置时有关。如果有人可以帮助我那会很棒。
另外,我想知道'是'有点'真的是一个类变量吗?' 也, 我可以/我是否可以定义实例变量而不是在类方法中,而只是在类定义下定义为'kind'在此示例中?
很抱歉这个问题很长。