2

我有一段python代码:

class A(object):
    args = [1,2]
    def __init__(self):
        print self.args

class B(A):
    args = [3,4]
    def __init__(self):
        super(B, self).__init__()
        print self.args

B()

输出是:

[3, 4]

[3, 4]

并不是

[1,2]

[3,4]

为什么派生类调用基类的构造函数时,使用的类属性来自派生类的命名空间?有没有办法让我使用函数所在类的类属性?

4

2 回答 2

1

有没有办法让我使用函数所在类的类属性?

是的。通过它们的类属性名称而不是它们的实例属性名称来引用它们。也就是说,A.args,不是self.args

class A(object):
    args = [1,2]
    def __init__(self):
        print A.args
于 2016-12-16T21:57:46.470 回答
0

这里发生的是,您实际上已经args用 B 的成员覆盖了变量。Python首先查看子类B,看看它是否可以args使用A的构造函数使用自己的版本进行打印。它找到 Bargs并打印该成员。

让我们看看当您将 A 重命名argsarg. 我们现在看到了预期的行为。

class A(object):
    arg = [1,2]
    def __init__(self):
        print self.arg

class B(A):
    args = [3,4]
    def __init__(self):
        super(B, self).__init__()
        print self.args
B()

输出:

[1, 2]
[3, 4]
于 2016-12-16T21:54:45.623 回答