我有一段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]
为什么从派生类调用基类的构造函数时,使用的类属性来自派生类的命名空间?有没有办法让我使用函数所在的类的类属性?
答案 0 :(得分:1)
我有办法使用函数所在类的类属性吗?
是。按类属性名称引用它们,而不是它们的实例属性名称。也就是说,A.args
,而不是self.args
。
class A(object):
args = [1,2]
def __init__(self):
print A.args
答案 1 :(得分:0)
这里发生的是你用B的成员改写了args
变量。 Python首先查看子类B,看它是否可以使用自己的A版构造函数打印args
。它找到B的args
并打印出该成员。
让我们看看当您将A的args
重命名为arg
之类的内容时会发生什么。我们现在看到预期的行为。
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]