Python类和实例变量

时间:2016-10-28 01:59:16

标签: python class instance-variables mutable class-variables

在完成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']

我知道类似的问题是hereherehere(仅举几例)。但我仍然没有得到它。我认为我的误解与mutable个对象以及idenity设置时有关。如果有人可以帮助我那会很棒。

另外,我想知道'是'有点'真的是一个类变量吗?' 也, 我可以/我是否可以定义实例变量而不是在类方法中,而只是在类定义下定义为'kind'在此示例中?

很抱歉这个问题很长。

0 个答案:

没有答案