我想让一些lambda函数可用于一个类的所有实例。因此,我的想法是将lambda函数声明为class属性。
在下面简单的代码中,为什么我不能评估我已经定义为类属性的以下lambda函数f
?
In [1]: class MyClass():
...: f = lambda x : 2 * x + 1
...: def __init__(self):
...: pass
In [2]: Inst = MyClass()
In [3]: MyClass.f
Out[3]: <unbound method MyClass.<lambda>>
In [4]: MyClass.f(2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-5fc154bfb75c> in <module>()
----> 1 MyClass.f(2)
TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got int instance instead)
In [5]: Inst.f(3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-90cde1a87da4> in <module>()
----> 1 Inst.f(3)
TypeError: <lambda>() takes exactly 1 argument (2 given)
答案 0 :(得分:5)
就好像你写了以下内容:
class MyClass():
def f(x):
return 2 * x + 1
def __init__(self):
pass
第一个参数按约定命名为self
,因此,即使您没有将其命名为self
,您的函数也是一个实例方法,其第一个参数是MyClass
的当前实例
您需要将您的函数设置为静态方法:
In [1]: %paste
class MyClass():
f = staticmethod(lambda x: 2 * x + 1)
def __init__(self):
pass
## -- End pasted text --
In [2]: MyClass.f(2)
Out[2]: 5