为什么python描述符中的__get__方法接受所有者类作为它的第三个参数?你能给出一个使用它的例子吗?
第一个参数(self)是不言而喻的,第二个(instances)在通常显示的描述符模式的上下文中是有意义的(如下所示),但我从未真正看到owner使用过的第三个().有人可以解释用例是什么吗?
仅仅通过参考和促进答案,这是我见过的描述符的典型用法:
class Container(object):
class ExampleDescriptor(object):
def __get__(self, instance, owner):
return instance._name
def __set__(self, instance, value):
instance._name = value
managed_attr = ExampleDescriptor()
Run Code Online (Sandbox Code Playgroud)
鉴于instance.__class__可用,我能想到的是显式传递类与直接从类而不是实例(ex Container.managed_attr)访问描述符有关.即便如此,我还不清楚__get__在这种情况下会做些什么.
我经常看到这个:
def __get__(self, instance, owner=None):
Run Code Online (Sandbox Code Playgroud)
为什么有些人使用的默认值None的的owner参数?
这甚至可以在Python文档中完成:
descr.__get__(self, obj, type=None) --> value
Run Code Online (Sandbox Code Playgroud) 简单再现:
class VocalDescriptor(object):
def __get__(self, obj, objtype):
print('__get__, obj={}, objtype={}'.format(obj, objtype))
def __set__(self, obj, val):
print('__set__')
class B(object):
v = VocalDescriptor()
B.v # prints "__get__, obj=None, objtype=<class '__main__.B'>"
B.v = 3 # does not print "__set__", evidently does not trigger descriptor
B.v # does not print anything, we overwrote the descriptor
Run Code Online (Sandbox Code Playgroud)
这个问题有一个有效的重复项,但是没有回答重复项,作为学习练习,我对CPython源码进行了更多研究。警告:我进入了杂草。我真希望我能从知道这些水域的船长那里得到帮助。为了我自己的未来利益和未来读者的利益,我试图尽可能明确地追踪正在寻找的电话。
我已经看到很多墨水溅到了__getattribute__应用于描述符的行为上,例如查找优先级。Python的片断在“援引描述符”下方For classes, the machinery is in type.__getattribute__()...大致在我的脑海里同意我认为是相应的CPython的源中type_getattro,我找到了通过看“tp_slots”然后tp_getattro填充其中。B.v …