Python 有这些方法:
__getattr__
、__getattribute__
和 __setattr__
。我知道__getattr__
和__getattribute__
之间的区别,this线程解释得很好。但我找不到任何人提到为什么__setattribute__
不存在。
有人知道这是什么原因吗?谢谢。
获取属性时,很容易区分两种情况:“该属性存在于属性解析的正常路径中”和“无法通过该路径解析”。因此,有两个函数可以插入:一个替换正常路径的函数(
__getattribute__
)和一个只处理第二种情况的函数(__getattr__
)
相比之下,由于您通常可以 [1] 为对象分配任意属性,因此无法区分“该属性可以正常分配”和“该属性需要特殊处理”。因此,对于设置任意属性来说,拥有两个函数实际上没有意义,因为它们的功能充其量会令人困惑,而在最坏的情况下会不一致[2]。所以你只能得到一个完全取代正常路径的(
__setattr__
)。
[1]
__slots__
和描述符的使用与这个假设相混淆。但是,它们的用例很少与您通常希望覆盖属性设置的少数情况重叠。
[2]问题是“
__setattribute__
”什么时候调用__setattr__
?”如果属性设置失败?如果属性现在不存在?如果__getattribute__
会调用__getattr__
什么时候获取属性?