为什么 python 中没有 __setattribute__?

问题描述 投票:0回答:1

Python 有这些方法:

__getattr__
__getattribute__
__setattr__
。我知道
__getattr__
__getattribute__
之间的区别,this线程解释得很好。但我找不到任何人提到为什么
__setattribute__
不存在。

有人知道这是什么原因吗?谢谢。

python setattribute getattr getattribute
1个回答
1
投票

获取属性时,很容易区分两种情况:“该属性存在于属性解析的正常路径中”和“无法通过该路径解析”。因此,有两个函数可以插入:一个替换正常路径的函数(

__getattribute__
)和一个只处理第二种情况的函数(
__getattr__
)

相比之下,由于您通常可以 [1] 为对象分配任意属性,因此无法区分“该属性可以正常分配”和“该属性需要特殊处理”。因此,对于设置任意属性来说,拥有两个函数实际上没有意义,因为它们的功能充其量会令人困惑,而在最坏的情况下会不一致[2]。所以你只能得到一个完全取代正常路径的(

__setattr__
)。


[1]

__slots__
和描述符的使用与这个假设相混淆。但是,它们的用例很少与您通常希望覆盖属性设置的少数情况重叠。

[2]问题是“

__setattribute__
”什么时候调用
__setattr__
?”如果属性设置失败?如果属性现在不存在?如果
__getattribute__
会调用
__getattr__
什么时候获取属性?

© www.soinside.com 2019 - 2024. All rights reserved.