我知道方法__getattribute__
和__getattr__
的作用不同。前者负责所有属性访问,而后者(如果已定义)在前者引发AttributeError时被调用。
令我感到困惑的是,为什么对于一种通常试图消除混淆的语言,甚至存在两个与属性访问相关的名称相似的方法。我什至无法想到要定义__getattr__
的情况;我只能在if语句或try语句中定义使用__getattribute__
的{{1}}。此外,用于属性访问的内置函数名为object.__getattribute__
,这会误导人们以为getattr
是属性访问的首选方法。这两种方法背后的历史是什么,它们是否仍然存在是有充分的理由的?