提问人:Will Holmes 提问时间:10/28/2016 最后编辑:CommunityWill Holmes 更新时间:10/28/2016 访问量:231
Python 类和实例变量
Python Class and Instance Variables
问:
在完成有关类的 python 教程时,它描述了类和实例变量。我的问题是:在下面的例子中,为什么“kind”的行为就像一个实例变量,即使它被声明了(至少从它作为类变量的位置来看?
我按照教程示例将 dog 类定义为
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')
并从类似的 print 语句中得到预期的输出:
After append roll over to Fido: Fido canine ['roll over']
After append roll over to Fido: Buddy canine ['roll over']
我明白为什么 Buddy 也有“翻身”。技巧是一个类变量。我不明白的是,然后我将 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']
我知道类似的问题在这里、这里和这里(仅举几例)。但我仍然不明白。我认为我的误解与可变对象以及何时设置相同性有关。如果有人能帮助我,那就太好了。
另外,我想知道“kind”真的是一个类变量吗?另外,我是否可以/是否应该不在类方法中定义实例变量,而是在本例中“kind”的类定义下定义实例变量?
对不起,这个问题很长。
答: 暂无答案
评论
d.kind
kind
d.kind = ...
Dog.kind = ...
d.kind
d
Dog.kind