蟒蛇地图包含lambda函数

问题描述:

我尝试创建地图像它包含lambda函数对象:蟒蛇地图包含lambda函数

class Map(object): 
    a = lambda x: True 

但是Python假定a作为Map类的方法,并希望它接受self参数,它是Map实例。

我当然可以写

class Map(object): 
    @staticmethod 
    def a(x): 
     return True 

但是实在是太长了。 是否可以做第一堂课?

+6

“太长”真的是一个值得担心的问题吗? – NPE

+0

为什么你想这是一个类,而不仅仅是一个函数模块? – jonrsharpe

+1

请注意,虽然我们有时使用短语作为速记,但并没有真正的“lambda函数”。这只是用于创建某些有限类型的完全正常函数的不同语法,通常为了方便,函数只需要作为另一个函数的参数存在。如果你立即给它一个名字,没有太多的理由使用lambda。 – DSM

是的,需要手动应用@staticmethod装饰到lambda

class Map(object): 
    a = staticmethod(lambda x: True) 

或者干脆给你lambda,需要self说法:

class Map(object): 
    a = lambda self, x: True 
+0

谢谢,但我记住,也许有没有使用装饰的方式。 – Eugene

+0

@Eugene:在Python 3中,如果你不*创建Map()的实例,'Map.a('something')'不需要'self'参数就可以工作。但是为什么还要打扰一堂课呢? –

+0

@Eugene:如果你正在创建一个实例,这两个选择是真的。你可以编写你自己的[描述符对象](http://docs.python.org/2/howto/descriptor.html)来包装'lambda',但是这将会是巨大的过度杀伤力。 –

这是非常不清楚你在问什么。第一段代码正确地做了它应该做的事 - 它将该函数设置为Map的属性a

Map.a(42) 

但是Python假定为Map类方法

Python没有 “假设”,它是一个 “类方法”。这不是一种“阶级方法”。在class声明的主体中设置的所有变量均成为该类的成员。你在期待什么?

“类方法”是指@classmethod装饰器的事情。这与@staticmethod修饰器的不同之处在于,它与没有任何一个的东西也不同。因为它既不是“类方法”也不是“静态方法”。你需要了解三者之间的差异。

@staticmethod装饰器只影响当您尝试调用实例Map的方法。你没有说你正在做这样的事情。当直接访问类的属性并调用它时,没有区别。