繁体   English   中英

Lambda函数传递不需要的自我

[英]Lambda function passing not desired self

看这段代码:

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并导致了此错误。

我想念什么?

由于my_funcmy_func的类属性, MyClass_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
>>>

有关更多信息,您可以查看以下来源:

lambda是用于定义函数对象的不同语法。 类主体中的函数总是被绑定并传递一个self变量(因为它们是描述符 )。

只需给您的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)

您需要给自己的lambda一个自变量。 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则将传递self

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()    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM