Lambda函数传递不是所希望的自我

时间:2014-12-23 19:51:20

标签: python class oop 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 :()需要3个位置参数,但是4个被赋予

我需要以与上面代码相​​同的方式调用lambda函数my_func,但是self出现在某个我不知道的地方并导致此错误。

我错过了什么?

4 个答案:

答案 0 :(得分: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
>>>

有关详细信息,请查看以下来源:

答案 1 :(得分:3)

lambda只是定义函数对象的不同语法。类主体中的函数始终绑定并传递self参数(因为它们是descriptors)。

简单地给你lambda那个论点:

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

替代方法是解包方法并传入普通函数对象:

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

或将lambda包裹在staticmethod对象中:

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

答案 2 :(得分:2)

你需要给你的lambda一个自我论证。 Lambdas只是普通的功能。这之间没有区别:

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

答案 3 :(得分:1)

lambdas是小型匿名函数,可以直接在方法的参数列表中编写。通常不希望将它们分配给变量。 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()