lambda函数可以是类属性吗?

时间:2017-03-03 16:14:37

标签: python lambda

我想让一些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)

1 个答案:

答案 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