Python 类和实例变量

Python Class and Instance Variables

提问人:Will Holmes 提问时间:10/28/2016 最后编辑:CommunityWill Holmes 更新时间:10/28/2016 访问量:231

问:

在完成有关类的 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”的类定义下定义实例变量?

对不起,这个问题很长。

实例变量 可变 类变量

评论

0赞 user2357112 10/28/2016
赋值给不赋给类变量。它分配给实例变量。还有一个类变量这一事实并不重要。d.kindkind
0赞 AChampion 10/28/2016
正如 @user2357112 所指出的,创建了一个名为 kind 的实例变量。你真正需要做的是改变.当您引用(在赋值之外)时,它会检查 doesn't find it 的本地范围,因此会检查并找到它。d.kind = ...Dog.kind = ...d.kinddDog.kind
0赞 Will Holmes 10/28/2016
谢谢!因此,在 python 中,您可以在创建实例后向实例添加新变量。我不知道。“print(Dog.kind)”总是给出“canine”。

答: 暂无答案