2016-07-14 46 views
-1

我有一類和嘗試更新,並返回這個類的實例函數:Python3.5函數返回無替代對象

class Foo: 
    def __init__(self): 
     self.datum = 'a' 
    def update(self): 
     self.datum = 'b' if self.datum == 'a' else 'a' 

def updater(foo_obj): 
    return(foo_obj.update()) 

但調用updater()回報None秒且不實例類別Foo。爲什麼是這樣?我可以改變什麼來獲得想要的結果?

type(updater(Foo())) #NoneType 
+3

您不會從'Foo.update'返回任何內容。 –

+0

在Dipak的答案上看到我的評論如下 – Taylor

回答

1

更新方法更新程序。

def updater(foo_obj): 
    foo_obj.update() 
    return(foo_obj) 

或從類功能return self

def update(self): 
     self.datum = 'b' if self.datum == 'a' else 'a' 
     return self 
+0

第一個是我想要的。爲什麼將它分成兩行完全改變了效果? – Taylor

+1

@Taylor因爲那麼你會返回對象本身,而不是'.update()'的返回值,它是'None'。 –

+0

是的,是有道理的。我以前沒有遇到過這種事,我感到很蠢。 – Taylor

1

update方法不返回任何東西,這在Python意味着它隱含返回None。如果你希望它有一個有意義的回報值,你必須明確地這樣做。例如:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self.datum 
0

如果您想update返回Foo類的實例,你必須明確地把它用一個return語句這樣做,否則會隱含地返回None(即它是一個無效的方法,即使Python不使用這些術語,因爲鴨子打字)。做到這一點,像這樣:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self 

你也可以返回updaterFoo對象,如果你不想讓你的類來做到這一點,就像這樣:

def updater(foo_obj): 
    foo_obj.update() 
    return foo_obj 

如果您想返回只是self.datum,而不是整個對象,則是這樣做:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self.datum 

或類似:

def updater(foo_obj): 
    foo_obj.update() 
    return foo_obj.datum