2017-09-05 145 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