Я пытаюсь обернуть голову концепцией дескрипторов, и в последнее время у меня не было успеха. Это article дескриптора. Как действительно помогло, и в то же время оно меня тоже смутило. Я борюсь с этим примером здесь почему m.x
называет def __get__(self, obj, objtype):
Понимание примера дескриптора из статьи «descriptors howto»
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'. – cdarke