【发布时间】:2015-04-28 20:41:42
【问题描述】:
我正在努力更好地理解描述符。
我不明白为什么在 foo 方法中描述符 __get__ 方法没有被调用。
据我了解描述符,当我通过点运算符访问对象属性或使用 __getattribute__() 时,总是会调用 __get__ 方法。
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
【问题讨论】:
-
我不太明白你的问题是什么?
-
@user3467349:
m.z和m.x都是类RevealAccess的实例,它实现了描述符协议。 OP 期望该协议同时用于m.z和m.x。 -
@user3467349:例如在回答问题之前,您需要了解描述符协议是什么。
-
m.z 准确返回为我分配给它的实例,我仍然不确定这里的预期输出是什么?
-
他的意思是打电话给
m.z.__getattribute__吗? MyClass 不是 RevealClass 的子类...
标签: python descriptor python-descriptors