我想了解何时定义__getattr__或__getattribute__。python文档中提到的__getattribute__适用于新式类。什么是新式类?
在 Python 中,”新式类”(new-style classes)是 Python 2.2 引入的一种类类型,与”经典类”(classic classes)相对。所有在 Python 3 中定义的类默认都是新式类,而在 Python 2 中,只有显式继承自 object 的类才是新式类。
object
经典类(Classic Classes):在 Python 2 中,未继承自 object 的类。例如: python class MyClass: pass 这种定义方式在 Python 2 中会创建一个经典类。
python class MyClass: pass
新式类(New-Style Classes):在 Python 2 中,继承自 object 的类,或者在 Python 3 中定义的所有类。例如: python class MyClass(object): pass 这种定义方式在 Python 2 中会创建一个新式类,而在 Python 3 中,无论是否继承 object,所有类都是新式类。
python class MyClass(object): pass
新式类引入了多个改进和特性,使得 Python 的面向对象编程模型更为一致和强大,例如:
__getattribute__
__new__
super()
__getattr__
定义 __getattr__:通常在你希望动态处理或默认处理未定义的属性时使用。例如,如果你想要提供一些默认行为或在属性不存在时执行特定的逻辑,定义 __getattr__ 是合适的。
定义 __getattribute__:如果你需要截获并自定义对象的属性访问(包括已存在的属性),你可以定义 __getattribute__。但是,由于它在每次访问属性时都会被调用,因此要特别注意避免递归问题。
简而言之,Python 3 中所有类都是新式类,所以你可以直接使用 __getattribute__ 和 __getattr__,无需担心兼容性问题。如果你还在使用 Python 2,记得继承 object 以确保你的类是新式类。