我试图围绕描述符的概念来思考,但最近我没有成功。这篇关于如何描述的文章确实有帮助,同时也让我感到困惑。我在这个例子中苦苦挣扎,为什么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
。如果有人能解决这个问题,我将不胜感激。