2014-12-23 54 views
0

看看這個代碼:lambda函數傳遞不希望自己

class MyClass_1(): 
    @staticmethod 
    def method_1(func): 
     return func(1, 2, 3) 

class MyClass_2(): 
    my_func = lambda a,b,c : a*b*C# I need to call this method 

    def method_2(self): 
     result = MyClass_1.method_1(self.my_func) 
     print(result) 

我的錯誤:

TypeError:() takes 3 positional arguments but 4 were given

我需要調用lambda函數my_func以同樣的方式爲上面的代碼,而是一個self出現在我不知道的地方,導致了這個錯誤。

我錯過了什麼?

+0

你明白爲什麼'def my_func(a,b,c):return a * b * c'不起作用嗎? lambda和使用'def'一樣,如果你在一個類中定義它,你需要包含'self'。 – Duncan

+0

是啊..這是一件值得思考的事情......即使我將其設置爲靜態也不行。 –

+1

使用'@ staticmethod'可以起作用,'@ classmethod'你需要'cls'的第一個參數。在所有方面(除了tracebacks中顯示的函數名稱),lambda不會多於也不少於返回相同表達式的一行函數。 – Duncan

回答

4

由於my_funcMyClass_2的類屬性,因此您不應該通過self(該類的一個實例)訪問它。相反,你應該直接訪問它通過類:

result = MyClass_1.method_1(MyClass_2.my_func) 
          ^^^^^^^^^ 

演示:

>>> class MyClass_1(): 
...  @staticmethod 
...  def method_1(func): 
...   return func(1, 2, 3) 
... 
>>> class MyClass_2(): 
...  my_func = lambda a,b,c : a*b*C# I need to call this method 
...  def method_2(self): 
...   result = MyClass_1.method_1(MyClass_2.my_func) 
...   print(result) 
... 
>>> MyClass_2().method_2() 
6 
>>> 

欲瞭解更多信息,你可以檢查出這些來源:

+0

工作。但是,在這段歷史中,「自我」如何/在哪裏? –

+1

當你在'self'上調用'my_func'時,Python會隱式地將對類實例的引用作爲第一個參數傳遞。但'my_func'是一個類屬性,這意味着它不需要/使用這個引用。所以,我們直接從課堂上調用它來避免這種情況。 – iCodez

+0

明白了!謝謝! –

3

A lambda是定義函數對象的不同語法。班級機構的職能是總是綁定並通過self參數(因爲他們是descriptors)。

,只需提供您的lambda這樣的說法:

my_func = lambda self, a, b, c: a * b * c 

另一種方法是爲你解開的方法,並通過在普通函數對象:

result = MyClass_1.method_1(self.my_func.__func__) 

或包裹在你的lambdastaticmethod object:

my_func = staticmethod(lambda a, b, c: a * b * c) 
2

你需要給你的lambda一個自我論證。蘭巴達斯只是普通的功能。有這之間沒有什麼區別:

class Foo(): 
    my_func = lambda a,b,c : a*b*c 

class Foo(): 
    def my_func(a, b, c): 
     return a*b*c 

在這兩種情況下,my_func是一種方法,如果你把它的一個實例self會獲得通過。

1

lambda是小的匿名函數,可以直接寫入方法的參數列表中。將它們分配給一個變量通常是不可取的。這裏lambda的典型用法是:

class MyClass_1(): 
    @staticmethod 
    def method_1(func): 
     return func(1, 2, 3) 

class MyClass_2(): 

    def method_2(self): 
     result = MyClass_1.method_1(lambda a,b,c: a*b*c) 
     print(result) 

MyClass_2().method_2()