2016-05-13 20 views
0

我正在學習燒瓶,現在我正在閱讀燒瓶代碼。
我進入了一個我無法完全理解的塊。python 3中的lambda如何處理參數引用?

def implements_to_string(cls): 
    cls.__unicode__ = cls.__str__ 
    cls.__str__ = lambda x: x.__unicode__().encode('utf-8') 
    return cls 

@implements_to_string 
class Test(object): 
    def __init__ (self): 
     pass 

test = Test() 
print(test.__str__) 
print(test.__str__()) 

第一打印顯示拉姆達方法爲:

<bound method Test.<lambda> of <__main__.Test object at 0x7f98d70d1210>> 

第二種:

<__main__.Test object at 0x7fcc4394d210> 

所以,當確實在FUNC implements_to_string拉姆達的x成爲cls對象?
它只是一個我現在只需要記住的內在機制?
或者還有其他需要知道的東西嗎?

+0

調用lambda函數時的'x'參數不是'Test'類,而是實例'test'。 Python以實例('self')作爲第一個參數調用instancemethods。 – resi

+0

@resi非常感謝。我現在認爲,在類環境下的lambda函數會將第一個參數作爲'self' – John

回答

0

從文檔:

小匿名函數可以用lambda關鍵字來創建。這個函數返回它的兩個參數的總和:lambda a, b: a+b。 Lambda函數可用於需要函數對象的任何地方。它們在語法上受限於單個表達式。在語義上,它們只是正常函數定義的語法糖。

你實現implements_to_string是類似於我在這裏:

def implements_to_string(cls): 
    cls.__unicode__ = cls.__str__ 

    def lambda_func(self): 
     return self.__unicode__().encode('utf-8') 

    cls.__str__ = lambda_func 
    return cls 

所以,當確實在FUNC implements_to_string拉姆達的x成爲cls對象?

當您使用print(test.__str__)時,您正在打印方法本身並打印其表示形式。

但是,當您使用print(test.__str__())時,您首先執行該函數並打印該方法返回的內容。

+0

您可能想要在所包含的代碼片段中使用傳統的'self'變量名稱而不是'x',以使其更清晰正在進行。 –

+0

我現在知道,在課堂環境下的lambda中的第一個參數將被視爲正常函數中的「self」。謝謝@AKS和@Martin。 – John

+0

我剛剛使用'x'使它更接近用戶在片段中的內容。 – AKS