微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 为什么不会动态地添加一个`__call__`方法到一个实例?

Python 2和 Python 3中的代码
class Foo(object):
    pass

f = Foo()
f.__call__ = lambda *args : args

f(1,2,3)

返回为错误Foo对象不可调用.为什么会这样呢?

PS:用老式的课程,按照预期工作.

PPS:有行为(请参阅接受的答案).作为一个解决方法,可以在类级别定义一个__call__,只需转发给另一个成员,并将此“正常”成员设置为每个实例__call__实现.

解决方法

双下划线方法总是在类中查找,而不是实例.见 Special method lookup for new-style classes

For new-style classes,implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type,not in the object’s instance dictionary.

这是因为类型可能需要支持相同的操作(在这种情况下,特殊方法元类型上查找).

例如,类是可调用的(这就是生成一个实例),但是如果Python在实际对象上查找__call__方法,那么在为其实例实现__call__的类中,您永远不会这样做. ClassObject()将成为ClassObject .__调用__(),因为self参数不会传入未绑定的方法,所以会失败.所以代替键入(ClassObject).__调用__(ClassObject),并调用instance()转换为type(instance).__调用__(instance).

原文地址:https://www.jb51.cc/python/185566.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐