为什么__set__
当存在同名的实例属性时,未实现的描述符会被 Python 中的实例属性所掩盖,而对于确实实现的描述符则不然__set__
?
毕竟,两种类型的描述符都有一个,所以在检索值时__get__
不应该使用它吗?__get__
作为问题的一个例子,假设我们有以下 shell 会话。
>>> class OverridingDescriptor:
... def __set__(self, instance, value):
... instance.__dict__["over"] = value
... def __get__(self, instance, owner):
... print(self.__class__.__name__ + ".__get__")
... return instance.__dict__["over"]
...
>>> class NonOverridingDescriptor:
... def __get__(self, instance, owner):
... print(self.__class__.__name__ + ".__get__")
... return instance.__dict__["nonover"]
...
>>> class Container:
... over = OverridingDescriptor()
... nonover = NonOverridingDescriptor()
...
>>> c = Container()
>>> c.over = 14
>>> c.nonover = 14
>>> vars(c)
{'over': 14, 'nonover': 14}
>>> c.over
OverridingDescriptor.__get__
14
>>> c.nonover
14
为什么不是最后一行
>>> c.nonover
NonOverridingDescriptor.__get__
14
反而?这对我来说似乎是一个矛盾。