当访问实例的方法时,Python执行“绑定”,即创建绑定方法。请参见此处:
>>> class Class:
... def method(self, x):
... return x
...
>>>
>>> instance = Class()
>>> Class.method
<function Class.method at 0x7fa688037158>
>>> instance.method
<bound method Class.method of <__main__.Class object at 0x7fa688036278>>
绑定之所以完成,是因为方法是作为描述符实现的。
你也可以
implement your callable as a descriptor
如果你想有这种行为。
简而言之,您必须实现一个至少具有
__get__
方法那个
__得到__
当
Class.method
或
instance.method
评估。它应该返回可调用的(根据是否有实例,它应该是不同的)。
顺便说一句,要将方法实际绑定到实例,使用起来最简单
functors.partial
:
bound_method = functors.partial(method, instance)
总结如下:
class Callable:
def __call__(self, instance, arg):
print(f"Callable()(arg)")
class Descriptor:
def __init__(self, callable):
self._callable = callable
def __get__(self, instance, owner):
if instance is None:
return self._callable
else:
return functools.partial(self._callable, instance)
class Class:
pass
Class.method = Descriptor(Callable())
然后:
>>> signature(Class.method)
<Signature (instance, arg)>
>>> signature(Class().method)
<Signature (arg)>