我尝试创建包含lambda函数的对象的映射:
class Map(object):
a = lambda x: True
但是python假设a
为Map
类方法,并期望接受self
参数为Map
实例。
当然我可以写
class Map(object):
@staticmethod
def a(x):
return True
但它太长了。 是否有可能成为第一堂课?
答案 0 :(得分:4)
是的,只需手动将@staticmethod
装饰器应用于lambda
:
class Map(object):
a = staticmethod(lambda x: True)
或者只是提供您需要lambda
参数的self
:
class Map(object):
a = lambda self, x: True
答案 1 :(得分:0)
目前还不清楚你在问什么。第一段代码正确执行了它应该执行的操作 - 它将该函数设置为a
的属性Map
。
Map.a(42)
但是python假设一个Map类方法
Python不“假设”它是一个“类方法”。它不是“阶级方法”。在class
声明的正文中设置的所有变量都成为该类的成员。你有什么期待?
“类方法”是指具有@classmethod
装饰器的东西。这不同于@staticmethod
装饰器的东西,也不同于没有装饰器的东西。原样,它既不是“类方法”也不是“静态方法”。你需要了解这三者之间的差异。
@staticmethod
装饰器仅在您尝试在Map
的实例上调用方法时受到影响。你没有说你做过这样的事情。直接访问类的属性并调用它时,没有区别。