为何将__call__方法声明为classmethod后无法生效?
为什么将类的__call__声明为classmethod后,调用Foo()无法正常运行?
核心原因:Foo()是实例化操作,不会触发你定义的__call__方法
当你调用Foo()时,本质是实例化类创建对象,这个过程由Python的元类(默认是type)的__call__方法控制,它会依次执行:
- 调用类的
__new__创建实例 - 调用类的
__init__初始化实例 - 返回创建好的实例
你在Foo类中定义的__call__方法,哪怕不加@classmethod,也不会在Foo()时被触发——因为__call__特殊方法的作用是让类的实例变成可调用对象,而非控制类本身的实例化。
被装饰为classmethod后的__call__怎么用?
把__call__标记为classmethod后,它变成了类绑定的方法,你需要直接通过类调用它才会执行:
Foo.__call__() # 这会打印出0
如果是常规的__call__用法(让实例可调用),应该去掉@classmethod:
class Foo: bar = 0 def __call__(self): print(self.bar) foo = Foo() foo() # 此时调用实例会触发__call__,打印0
总结
Foo()是实例化操作,由元类的__call__处理,和你定义的类级__call__无关__call__的设计初衷是赋予实例可调用能力,标记为classmethod违背了这个设计逻辑,也改变了它的触发时机
内容的提问来源于stack exchange,提问作者gld.g
相关产品推荐
相关产品推荐

