【发布时间】:2020-01-10 08:28:45
【问题描述】:
假设我们有一个我们想要对其进行monkeypatch 的类和一些我们想要对其进行monkeypatch 的可调用对象。
class Foo:
pass
def bar(*args):
print(list(map(type, args)))
class Baz:
def __call__(*args):
print(list(map(type, args)))
baz = Baz()
def wrapped_baz(*args):
return baz(*args)
Foo.bar = bar
Foo.baz = baz
Foo.biz = wrapped_baz
Foo().bar() # [<class '__main__.Foo'>]
Foo().baz() # [<class '__main__.Baz'>]
Foo().biz() # [<class '__main__.Baz'>, <class '__main__.Foo'>]
尽管baz 是可调用的,但它不会像bar 和wrapped_baz 这两个函数那样绑定到Foo() 实例。由于 Python 是一种鸭子类型的语言,因此给定的可调用对象的类型会在对象机制的行为中扮演如此重要的角色,这似乎很奇怪。
并不是说包装可调用对象一定是一种不好的方法,还有其他方法可以将可调用对象适当地绑定到Foo 实例吗?这是 CPython 实现的怪癖,还是语言规范的一部分描述了观察到的行为?
【问题讨论】:
标签: python python-3.x class methods python-internals