看一下这段代码:
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
出现在某个我不知道的地方并导致此错误。
我错过了什么?
答案 0 :(得分:4)
由于my_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
>>>
有关详细信息,请查看以下来源:
答案 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()