Я пытаюсь осмыслить концепцию дескрипторов, и в последнее время мне это не удалось. Эта статья дескриптора How to действительно помогла и в то же время тоже меня смутил. Я борюсь с этим примером здесь, почему m.x
вызывает def __get__(self, obj, objtype):
class RevealAccess(object):
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print('Retrieving', self.name)
return self.val
def __set__(self, obj, val):
print('Updating', self.name)
self.val = val
>>> class MyClass(object):
... x = RevealAccess(10, 'var "x"')
... y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
Я считаю, что причина, по которой я борюсь с этим, заключается в том, что меня смущает следующее утверждение в статье.
Детали вызова зависят от того, является ли obj объектом или классом. Для объектов механизм находится в
object.__getattribute__()
, который преобразуетb.x
вtype(b).__dict__['x'].__get__(b, type(b))
. Реализация работает через цепочку приоритетов, которая дает дескрипторам данных приоритет над переменными экземпляра, приоритет переменных экземпляра над дескрипторами, не относящимися к данным, и назначает самый низкий приоритет__getattr__()
, если он предоставлен.
Я не уверен, что автор имеет в виду здесь под объектом или классом. Означает ли объект экземпляр класса? Я понимаю, что когда мы делаем instance.var
, python внутри делает instance.__dict__["var"]
, если он не найден, то он делает class.__dict__["var"]
. Я немного потерял его после этой концепции. Может ли кто-нибудь объяснить немного о том, как работает этот пример. Как определение def __get__(self, obj, objtype):
вызывается с помощью m.x
. Буду очень признателен, если кто-нибудь прояснит это.
def __get__(self, instance, owner)
, это может быть понятнее.RevealAccess
— это класс дескриптора, аMyClass
— класс-владелец. Имейте в виду, что классы являются объектами, поэтомуowner
будет объектом классаMyClass
. - person cdarke   schedule 08.11.2016