实例可以调用双下划线call方法;类也可以调用双下划线call方法,但二者有大的差别;
实例调用双下划线call方法是在实例及类内部查找,如果没有,直接报错TypeError
类调用双下划线call方法会在实例中查找
元类(type)内部具有__call__方法
1. 类调用触发元类的 __call__:
• 类的调用行为(MyClass())由其元类的 __call__ 控制。
• 元类的 __call__ 负责调用类的 __new__ 和 __init__。
2. 实例调用触发类的 __call__:
• 实例的调用行为(obj())由其所属类的 __call__ 方法控制。
• 如果类未定义 __call__ 方法,则会抛出 TypeError,不会回溯到元类。
3. 为什么不回溯到元类的 __call__?
• 这是 Python 的设计选择,明确分层,避免语义混乱。
• 元类的 __call__ 专注于类调用,类的 __call__ 专注于实例调用。
标签:__,调用,下划线,元类,实例,call
From: https://www.cnblogs.com/hayaso/p/18587979