有一些代码,但我不明白为什么它以这种方式工作:
class A(object):
first = 20
second = 30
class B(A):
first = 21
second = 31
def mix(A):
print(A.second)
var = B()
var.mix()
,输出为31,但我预计30
答案 0 :(得分:3)
first
和second
是A
的类属性,并且继承自A
,然后在B
中重写。我认为,这就是你所期待的。
>>> class A(object):
first = 20
second = 30
>>> class B(A):
first = 21
second = 31
def mix(A):
print(A.second)
>>> A.first
20
>>> A.second
30
>>> B.first
21
>>> B.second
31
您感到惊讶的原因是您已将第一个参数命名为B.mix
,始终是实例本身,并且通常命名为self
,A
。因此,在mix
方法内,该参数(B
的实例)是"阴影" 类A
。如果我们将两者都更改为self
,您将看到相同的行为(并且它可能会更清楚为什么正在发生):
>>> class B(A):
first = 21
second = 31
def mix(self):
print(self.second)
>>> b = B()
>>> b.mix()
31
现在,如果我们保留传统的self
参数名称,但将内部名称更改为A
,您将不再隐藏该类,并查看原始值class属性:
>>> class B(A):
first = 21
second = 31
def mix(self):
print(A.second)
>>> b = B()
>>> b.mix()
30