Я пытаюсь лучше понять дескрипторы.
Я не понимаю, почему в методе foo не вызывается метод дескрипторов __get__
.
Насколько я понимаю дескрипторы, метод __get__
всегда вызывается, когда я обращаюсь к атрибуту объекта с помощью оператора точки или когда я использую __getattribute__()
.
Согласно документации Python:
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
def foo(self):
self.z = RevealAccess(13, 'var "z"')
self.__getattribute__('z')
print(self.z)
m = MyClass()
m.foo()
m.z # no print
m.x # prints var x
m.z
иm.x
оба являются экземплярами классаRevealAccess
, который реализует протокол дескриптора. ОП ожидал, что протокол будет использоваться как дляm.z
, так и дляm.x
. - person Martijn Pieters   schedule 28.04.2015m.z.__getattribute__
? MyClass не является подклассом RevealClass... - person user3467349   schedule 28.04.2015m
обрабатываетсяtype(m).__getattribute__(attribute)
и именно там выполняется протокол дескриптора. - person Martijn Pieters   schedule 29.04.2015Retrieving var "z"
; например был вызван методRevealAccess.__get__
. - person Martijn Pieters   schedule 29.04.2015RevealAccess.__get__
вообще будет вызываться, если только вы не читаете что-то отличное от того, что связано с OP. - person user3467349   schedule 29.04.2015RevealAccess.__get__
вызывается при доступе кm.x
. - person Martijn Pieters   schedule 29.04.2015