Python:解释程序的结果

时间:2012-11-18 09:20:58

标签: python oop delegation specialization

我的一项测试任务(获得一个初级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。 提前谢谢!

2 个答案:

答案 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
???