以下代码:
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
导致此输出:
[<__main__.Link instance at 0xb65a4b0c>]
[<__main__.Link instance at 0xb65a4b0c>]
我发现这很奇怪:既然是另一个例子? - 我原以为输出是 - 因为它是另一个实例?:
[<__main__.Link instance at 0xb65a4b0c>]
[]
将行house.links.append(link)
更改为house.links = [link]
时,一切都按预期工作。
有人可以解释这种行为吗?
答案 0 :(得分:19)
这是另一个实例,但您已将links
定义为类变量而非实例变量。
实例变量将被定义为:
class House(object): # Always use new-style classes except for backward compatibility
def __init__(self):
self.links = []
请注意,在Python中,与其他语言不同,实例变量显式声明为实例的属性。这通常发生在__init__
方法中,以确保每个实例都有变量。
然后,子类看起来像这样:
class Villa(House):
def __init__(self):
super(Villa, self).__init__()
执行代码会得到正确的结果:
>>> house = House()
>>> villa = Villa()
>>> link = Link()
>>> house.links.append(link)
>>> print house.links
[<__main__.Link instance at 0xcbaa8>]
>>> print villa.links
[]
答案 1 :(得分:3)
在您的代码中,links
是该类的一个属性,使其由该类的所有实例共享:
class House:
links = []
因此,您的Villa
类共享此属性,因为Villa
的实例(作为子类)也是House
的实例。
如果您想使links
成为实例变量,请编写构造函数并将links
设置为self
的属性,例如
class House:
def __init__(self):
self.links = []