python2.7中类继承的奇怪行为

2024-03-29 08:04:42 发布

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

我有一个关于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')

在这种情况下,我得到正常的输出,但仍然不明白为什么会发生这种情况。你知道吗

谢谢


Tags: 实例inselfforiffooinitdef
2条回答

在第一种情况下,l是一个类变量,这个变量由类的实例共享。你知道吗

在第二种情况下,l是一个实例变量,因此每个对象都有自己的变量。你知道吗

请注意,这与继承无关—如果实例化类A或类B,您将看到相同的行为

问题是l不是一个实例变量,每个A(或B)实例都有自己的副本,它是一个变量,由所有副本共享。你知道吗

如果你不想要一个类变量,就不要定义一个。就像在B.__init__中创建self.a一样,在A.__init__中创建self.l。你知道吗

相关问题 更多 >