我有一个关于Python2.7继承的问题。你知道吗
我有两个简单的班
class A():
l = []
def f(self):
del self.l[:]
if self.a == 'a':
self.l.append('1')
if self.a == 'b':
self.l.append('2')
class B(A):
def __init__(self, a):
self.a = a
我在循环中创建了两个B实例,并为set list'l'调用f()
foo = ['a','b']
l = []
for x in foo:
z = B(x)
z.f()
# normal result
print z.l
l.append(z)
print '-----'
for x in l:
# strange result
print x.l
结果我得到了奇怪的结果:
Output:
['1']
['2']
-----
['2']
['2']
[Finished in 0.0s]
而不是1,2;1,2
为什么会这样?你知道吗
我可以通过在def(self)中定义列表“l”来修复它
class A():
def f(self):
l = []
if self.a == 'a':
self.l.append('1')
if self.a == 'b':
self.l.append('2')
在这种情况下,我得到正常的输出,但仍然不明白为什么会发生这种情况。你知道吗
谢谢
在第一种情况下,
l
是一个类变量,这个变量由类的实例共享。你知道吗在第二种情况下,
l
是一个实例变量,因此每个对象都有自己的变量。你知道吗请注意,这与继承无关—如果实例化类A或类B,您将看到相同的行为
问题是
l
不是一个实例变量,每个A
(或B
)实例都有自己的副本,它是一个类变量,由所有副本共享。你知道吗如果你不想要一个类变量,就不要定义一个。就像在
B.__init__
中创建self.a
一样,在A.__init__
中创建self.l
。你知道吗相关问题 更多 >
编程相关推荐