2017-09-05 99 views
0

我有以下代码与父类TestMyTest的子类。 从外面看,我试图访问父类而不是子类的方法。所以我期待父类的display函数。所以,我用super函数来实现这一点。到现在为止还挺好。但是当我尝试将超级函数的返回分配给一个变量,如z,我看到它会打印出我期望的内容,并且还会打印'None'超级函数返回None与结果

class Test(object): 
    def display(self, x): 
     self.x = x 
     print self.x 

class MyTest(Test): 
    def someother(self): 
     print "i am a different method" 
    def display(self, x): 
     self.x = x 
     print "Getting called form MyTest" 



a = MyTest() 
z = super(type(a), a).display(10) 
print z 

10 
None 

我试图理解为什么超强功能与预期值一起返回“无”

+2

你需要添加''的默认display'它'返回None' –

+1

你需要一个'返回自内return' .x'。否则,您可以改为“打印a.x”。 –

+0

打印与返回结果*不同。任何函数的默认返回值都是'None',除非它专门返回不同的东西。 –

回答

1

MyTest.display方法不包括任何return声明。 因此,隐含return None。 因此,z = super(type(a), a).display(10)导致将None分配到z

你需要在你的方法追加一个return语句,例如:

def display(self, x): 
    self.x = x 
    print "Getting called form MyTest" 
    return self.x 
1

任何python中不明确地使用他们的return将默认返回None调用

因此,要解决这个问题只需要使用return而不仅仅是打印的:

class Test(object): 
    def display(self, x): 
     self.x = x 
     return self.x 
+0

这并不完全正确:虽然没有明确的'return'语句来让'Foo()'返回创建的实例,类可以被调用。但我承认这是挑剔的。 –

+0

是的,但他们也可以实现__call__这就是为什么我选择callable而不是函数,但你是对的 – Netwave