根据Python的文档,
带有
__set__()和__get__()定义的数据描述符总是覆盖实例字典中的重定义.
我理解这句话没有问题,但是有人可以为我澄清为什么会有这样的规则吗?毕竟,如果我想覆盖实例字典中的属性,我已经需要明确地执行(inst.__dict__["attr"] = val),因为天真inst.attr = val会调用描述符的__set__方法,这通常会覆盖实例字典中的属性.
编辑:为了说清楚,我理解发生了什么,我的问题是为什么这样的规则到位.
以下代码的结果令我难以置信:
class MyClass(type):
@property
def a(self):
return 1
class MyObject(object):
__metaclass__ = MyClass
a = 2
print MyObject.a
print object.__getattribute__(MyObject, 'a')
print type.__getattribute__(MyObject, 'a')
print MyObject.__dict__['a']
print MyObject().a
Run Code Online (Sandbox Code Playgroud)
我真的希望这只是2重复打印,但它会打印出来1 1 1 2 2.有没有一种方法可以直观感觉?
澄清一下:我理解这种行为有很好的文档记录(这里是"数据描述符"),但我想了解为什么这有意义,以及核心开发人员为什么以这种方式实现描述符.