【发布时间】:2016-11-02 22:54:45
【问题描述】:
有人可以解释为什么描述符的非函数__get__ 属性在调用时似乎接收到一个额外的参数 - 即描述符对象(在函数的情况下隐式传递为 self)?
在下面的示例中,B 和 C 都是非数据描述符(它们具有 __get__ 属性)。 B 的__get__ 属性是A 的一个实例——它是可调用的——而C 是一个函数的实例(一个函数)——也是可调用的。类D 和E 有一个名为attr 的属性,其类型分别为B 和C。
根据我对python的属性查找过程的理解,访问D/E的实例的attr属性最终会在D/E.__dict__中找到attr,注册为非数据描述符会返回调用@的结果描述符对象上的 987654338@ - 但是此调用的签名似乎因描述符 __get__ 属性的类型而异。
我没有这个场景的特定用例,但想象A 充当一种有状态的函数类,我可以从设计的角度看到这种行为作为@ 的一种方式是如何有意义的987654341@ 与描述符通信。但是我无法理解为什么会发生这种行为 - 这种行为是隐含的还是我遗漏了什么?
class A(object):
def __call__(self, desc, obj, cls):
print 'A::__call__\n'
class B(object):
__get__ = A()
class C(object):
def __get__(self, obj, cls):
print 'C::__get__\n'
class D(object):
attr = B()
class E(object):
attr = C()
>>> D().attr
A::__call__
>>> E().attr
C::__get__
【问题讨论】:
标签: python