python - lambda 调用@classmethod 失败

标签 python

也许我完全错了,但我遇到了 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。还要注意 ClassMethodLAMBDA 不遵循正常的 Python 大写样式规则。)

关于python - lambda 调用@classmethod 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197223/

相关文章:

python - Django:在最大外键值上选择不同的值

Python: Mechanize

python - 解析由标签分隔的部分

python - 如何正确读取带有日期的 csv 并省略 pandas 中的前导零?

python - 导入缺少模块时更友好的错误消息

python - 尽管超时,Pytest 仍然挂起

python - Python 样条曲线(使用控制节点和端点)

python - 根据列值返回用户列表

python - 获取 gtk.StatusIcon 在 Windows 上的位置

python - 无法点击 map 上的标志