__call__方法作为类方法不起作用?

__call__ method as classmethod not working?

提问人:gld.g 提问时间:8/7/2023 最后编辑:Markgld.g 更新时间:8/7/2023 访问量:56

问:

我想知道为什么当我将函数声明为类方法时,我的类中的调用方法不起作用。 下面是一个示例:

class Foo:
    bar = 0
    @classmethod
    def __call__(cls):
        print(cls.bar)

当我使用 Foo() 时,它不会打印出栏。为什么?

Python 方法 调用

评论

3赞 Mark 8/7/2023
我很难理解为什么你会这样做,而不仅仅是制作一个函数。如果这按照您想要的方式工作,则永远无法创建类的实例。

答:

2赞 user2357112 8/7/2023 #1

@classmethod当方法查找找到方法不会更改。它只会更改找到方法时绑定的参数

穿上你的意味着,如果你调用你的类的实例:@classmethod__call__Foo

foo = Foo()  # not here
foo()        # here

第一个参数将是类,而不是实例。__call__

穿上你的遗嘱并不意味着该方法被用于调用自己。在查找实现语言功能的魔术方法时,Python 几乎在所有情况下都会绕过普通方法查找过程,并通过对象类的 MRO 执行直接搜索。除其他原因外,这避免了在更常见的情况下使用 for,其中 is 实例方法,并且从未打算被调用来实现操作本身。@classmethod__call__FooFoo.__call__Foo()Foo.__call__Foo()

对于一个调用,对象是它自己,它的类是,所以查找会发现,绕过直接在 上定义的任何内容。Foo()Footype__call__type.__call__Foo