奇怪的Python行为还是我遗漏了什么

2024-06-16 13:47:33 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码:

class House:
    links = []

class Link:
    pass

class Villa(House):
    pass

if __name__ == '__main__':
    house = House()
    villa = Villa()
    link = Link()
    house.links.append(link)

    print house.links
    print villa.links

输出结果:

^{pr2}$

我觉得这很奇怪:既然是另一个例子?-我本以为输出是-因为它是另一个实例?公司名称:

[<__main__.Link instance at 0xb65a4b0c>] 
[]

当将house.links.append(link)更改为house.links = [link]时,一切正常。在

有人能解释一下这种行为吗?在


Tags: 代码nameifmainlinkpasslinksclass
2条回答

在您的代码中,links是类的一个属性,使该类的所有实例共享它:

class House:
    links = []

因此,Villa类共享此属性,因为Villa的实例(作为子类)也是{}的实例。在

如果您想使links成为实例变量,请编写一个构造函数并将links设置为self的属性,例如

^{pr2}$

这是另一个实例,但是您已经将links定义为类变量而不是实例变量。在

实例变量的定义如下:

class House(object):  # Always use new-style classes except for backward compatibility
  def __init__(self):
    self.links = []

注意,在Python中,与其他语言不同,实例变量被显式声明为实例的属性。这通常发生在__init__方法中,以确保每个实例都有变量。在

然后,子类如下所示:

^{pr2}$

执行代码会得到正确的结果:

>>> house = House()
>>> villa = Villa()
>>> link = Link()
>>> house.links.append(link)
>>> print house.links
[<__main__.Link instance at 0xcbaa8>]
>>> print villa.links
[]

相关问题 更多 >