相关疑难解决方法(0)

为什么python描述符__get__方法接受所有者类作为arg?

为什么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__在这种情况下会做些什么.

python

15
推荐指数
1
解决办法
1249
查看次数

为什么人们在__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)

python descriptor python-3.x python-descriptors

10
推荐指数
2
解决办法
458
查看次数

为什么在类上设置描述符会覆盖描述符?

简单再现:

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 …

python cpython python-descriptors

10
推荐指数
1
解决办法
137
查看次数