lambda调用@classmethod失败

ja.*_*.ro 6 python

也许我完全错了但是我遇到了lambda调用@classmethod的一些奇怪问题.

我有以下课程:

class MyClass:
  LAMBDA = lambda: MyClass.ClassMethod()

  @classmethod
  def ClassMethod(cls):
    pass
Run Code Online (Sandbox Code Playgroud)

但是每当调用LAMBDA时,这都会失败:

TypeError: unbound method <lambda>() must be called with MyClass instance as first argument (got nothing instead)
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么会这样.我已经花了一些时间试图让它工作.我需要一些由该lambda填充的类属性,并且在该阶段显然不可能自引用该类.

shy*_*ent 2

您必须明白,您的代码完全等同于

class MyClass:

  def LAMBDA():
    return MyClass.ClassMethod()

  @classmethod
  def ClassMethod(cls):
    pass
Run Code Online (Sandbox Code Playgroud)

那么,你显然称其为MyClass.LAMBDA()。但是看,LAMBDA 是一个实例方法。而且您在没有实际实例的情况下调用它。

你到底想做什么?

我认为,如果您要为 lambda 构造命名,您不妨以“正常”方式声明它 - def。根据我的经验,只有少数孤立的情况下使用lambdas实际上有助于提高代码质量。

  • @KennyTM,“类成员”不是 Python 术语,所以它似乎是一个奇怪的平台,可供选择挑剔。当 shylent 说这是一种方法时,他的意思就像我们经常做的那样:他谈论的是语义,而不是名称。 (2认同)
  • 与所有 Python 实例方法一样,您在类上存储函数对象。lambda 和 def 创建的函数对象是同一类东西。当查找该对象时,将调用描述符协议,并且在查找实例时它们会变成绑定方法,如果在其类上查找则变成非绑定方法。这——当需要一个普通函数时在这里创建一个方法的部分——是理解问题的关键,所以这就是为什么 shylent 谈论它。 (2认同)