蟒蛇地图包含lambda函数
我尝试创建地图像它包含lambda函数对象:蟒蛇地图包含lambda函数
class Map(object):
a = lambda x: True
但是Python假定a
作为Map
类的方法,并希望它接受self
参数,它是Map
实例。
我当然可以写
class Map(object):
@staticmethod
def a(x):
return True
但是实在是太长了。 是否可以做第一堂课?
是的,需要手动应用@staticmethod
装饰到lambda
:
class Map(object):
a = staticmethod(lambda x: True)
或者干脆给你lambda
,需要self
说法:
class Map(object):
a = lambda self, x: True
谢谢,但我记住,也许有没有使用装饰的方式。 – Eugene
@Eugene:在Python 3中,如果你不*创建Map()的实例,'Map.a('something')'不需要'self'参数就可以工作。但是为什么还要打扰一堂课呢? –
@Eugene:如果你正在创建一个实例,这两个选择是真的。你可以编写你自己的[描述符对象](http://docs.python.org/2/howto/descriptor.html)来包装'lambda',但是这将会是巨大的过度杀伤力。 –
这是非常不清楚你在问什么。第一段代码正确地做了它应该做的事 - 它将该函数设置为Map
的属性a
。
Map.a(42)
但是Python假定为Map类方法
Python没有 “假设”,它是一个 “类方法”。这不是一种“阶级方法”。在class
声明的主体中设置的所有变量均成为该类的成员。你在期待什么?
“类方法”是指@classmethod
装饰器的事情。这与@staticmethod
修饰器的不同之处在于,它与没有任何一个的东西也不同。因为它既不是“类方法”也不是“静态方法”。你需要了解三者之间的差异。
@staticmethod
装饰器只影响当您尝试调用实例的Map
的方法。你没有说你正在做这样的事情。当直接访问类的属性并调用它时,没有区别。
“太长”真的是一个值得担心的问题吗? – NPE
为什么你想这是一个类,而不仅仅是一个函数模块? – jonrsharpe
请注意,虽然我们有时使用短语作为速记,但并没有真正的“lambda函数”。这只是用于创建某些有限类型的完全正常函数的不同语法,通常为了方便,函数只需要作为另一个函数的参数存在。如果你立即给它一个名字,没有太多的理由使用lambda。 – DSM