也许我完全错了,但我遇到了 lambda 调用 @classmethod 的一些奇怪问题。
我有以下类(class):
class MyClass:
LAMBDA = lambda: MyClass.ClassMethod()
@classmethod
def ClassMethod(cls):
pass
但是每当调用 LAMBDA 时,这都会失败:
TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got nothing instead)
我真的不明白为什么会这样。我已经花了一些时间试图让它工作。我需要一些由该 lambda 填充的类属性,并且在那个阶段自引用该类显然是不可能的。
最佳答案
LAMBDA
这里只是一个普通的方法。当你在类中查找它时,你会得到一个未绑定(bind)方法,这是一种愚蠢的东西,它接受你的函数并强加它——尽管 self
没有被传递然而——它的第一个参数必须是相关类的一个实例。
重申一下,LAMBDA = lambda: MyClass.ClassMethod()
与 def LAMBDA(): return MyClass.ClassMethod()
没有任何不同。在后一种情况下,更清楚的是您有一种损坏的方法定义。 lambda 函数和 def 函数形成完全相同类型的对象,Python 在查找时将它们转换为具有相同规则的方法。
我怀疑你可能想要的代码是
class MyClass(object):
@classmethod
def ClassMethod(cls):
pass
MyClass.LAMBDA = MyClass.ClassMethod
或
class MyClass(object):
@classmethod
def ClassMethod(cls):
pass
@classmethod
def LAMBDA(cls):
return cls.ClassMethod()
(请注意,最后一个可以像您最初那样用 lambda 编写,但没有理由这样做。我个人永远不会在我的任何代码中使用 = lambda
。还要注意 ClassMethod
和 LAMBDA
不遵循正常的 Python 大写样式规则。)
关于python - lambda 调用@classmethod 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197223/