双下划线方法总是在类上查找,而不是实例上。请参阅
特殊方法查找新类 :
对于新型类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。
这是因为 类型 可能需要支持相同的操作(在这种情况下,将在元类型上查找特殊方法)。
例如,类是可调用的(这就是您生成实例的方式),但是如果Python 在实际对象上
查找
__call__方法,那么您将永远无法在为其实例实现的类上这样做。会变成失败的原因,因为未将参数传递给未绑定的方法。因此,改为使用,并将调用转换为。
__
__call__``ClassObject()``ClassObject.__call__()``self``type(ClassObject).__call__(ClassObject)``instance()``type(instance).__call__(instance)
要解决此问题,您可以
__call__在类中添加一个方法来检查类中的
__call__属性,如果存在,则对其进行调用。



