Я смотрел на документации дескриптора питона в here, и заявление, которое заставило меня думать, это:Python дескриптор - Документация неясная
Для объектов, машины в object.__getattribute__()
, который трансформирует b.x
в type(b).__dict__['x'].__get__(b, type(b))
под рубрикой Invoking Descriptors.
Последняя часть заявления b.x into type(b).__dict__['x'].__get__(b, type(b))
вызывает конфликт здесь. По моему пониманию, если мы ищем атрибут на экземпляре, то instance.__dict__
просматривается, и если мы не найдем ничего, ссылается на type(instance).__dict__
.
В нашем примере, b.x
затем следует оценивать как:
b.__dict__["x"].__get__(b, type(b))
вместо
type(b).__dict__['x'].__get__(b, type(b))
Является ли это понимание правильно? Или я ошибаюсь в интерпретации? Любое объяснение было бы полезно.
Спасибо.
Я добавляю вторую часть, а также:
Почему атрибуты экземпляра не уважает протокол дескриптора? Например: приведенный ниже код:
>>> class Desc(object):
... def __get__(self, obj, type):
... return 1000
... def __set__(self, obj, value):
... raise AttributeError
...
>>>
>>> class Test(object):
... def __init__(self,num):
... self.num = num
... self.desc = Desc()
...
>>>
>>> t = Test(10)
>>> print "Desc details are ", t.desc
Desc details are <__main__.Desc object at 0x7f746d647890>
Спасибо, что помогли мне.
Спасибо за отличное объяснение. –
Что делать, если у нас есть что-то вроде: >>> класс Desc (объект): ... Защита __get __ (я, OBJ, типа): ... вернуть 1000 ... Защита __set __ (я, OBJ, значение): ... поднять AttributeError ... >>> >>> класс Test (объект): ... защиту __init __ (я, NUM): ... self.num = Num . .. self.desc = Desc() ... >>> >>> t = Test (10) >>> print «Подробности о заказе», t.desc Детали описания <__ main __. Desc object при 0x7f746d647890> Почему атрибуты экземпляра не учитывают протокол дескриптора? –
Я добавил вторую часть, пожалуйста, обновите ответ и объясните это. –