我的一项测试任务(获得一个初级python职位)说我必须解释该程序的结果。它的代码是:
class SuperM: pass
SuperM.x = 0
class Super(SuperM):
def method(self):
self.x += 1
def delegate(self):
self.action()
class Inheritor(Super):
pass
class Replacer():
def method(self):
Super.x += 2
class Extender(Super):
def method(self):
Super.method(self)
class Provider(Super):
def action(self):
print self.x
if __name__ == '__main__':
for klass in (Inheritor, Replacer, Extender):
klass().method()
x = Provider()
x.delegate()
我该怎么写这个解释?为什么程序显示2
,而不是3
。
提前谢谢!
答案 0 :(得分:1)
捕获是区分实例变量和类变量。
循环:
for klass in (Inheritor, Replacer, Extender):
klass().method()
迭代3个班级。它为每个实例创建一个(临时)实例,并在其上调用method()
。让我们看看会发生什么:
Inheritor().method()
创建Inheritor
的新实例并设置self.x = self.x + 1
。该实例还没有x
属性,因此self.x
的读取通过继承回退到类变量SuperM.x == 0
并设置实例的 { {1}}至1. x
保持不变。
SuperM.x
- 几乎相同的逻辑,读取Replacer().method()
,回退到Super.x
并将类变量 SuperM.x == 0
设置为2。
Super.x
是指试图阅读Extender().method()
的{{1}},回到阅读Super.method()
(刚刚设置为2)并设置实例 self.x
到3。
然后调用Super.x
,尝试打印self.x
,然后返回阅读provider.action()
并打印self.x
。
请注意Super.x
是分配名为2
的类变量的唯一位置(开头除外)。此外,只修改了实例Replacer.method
变量,并且实例是临时的,因此这些方法不会做任何相关的事情。
答案 1 :(得分:0)
这是一个提示 - 不要立刻接近整个事情,把它分开。您认为以下代码应该怎么做?是吗?
>>> Super().method()
>>> Super.x
???