详解Python中 __get__和__getattr__和__getattribute__的区别
时间: 2024-01-10 10:21:12 浏览: 30
__get__、__getattr__和__getattribute__都是Python中用于访问属性的特殊方法,但它们之间有一些区别。
1. __getattribute__是一个特殊方法,它在访问任何属性时都会被调用。它是Python中最通用的属性访问方法。如果一个类定义了__getattribute__方法,那么在访问该类的任何属性时都会调用该方法。
2. __getattr__是在访问一个不存在的属性时被调用的方法。当访问一个不存在的属性时,Python会尝试调用__getattr__方法来处理。如果一个类定义了__getattr__方法,那么在访问该类的不存在的属性时会调用该方法。
3. __get__是一个描述符方法,它用于定义属性的访问行为。描述符是一种特殊的对象,它定义了属性的访问方式。当一个类的属性是一个描述符对象时,访问该属性时会调用描述符对象的__get__方法。
下面是一个示例,演示了这三个方法的区别:
```python
class MyClass:
def __getattribute__(self, name):
print("__getattribute__ is called")
return object.__getattribute__(self, name)
def __getattr__(self, name):
print("__getattr__ is called")
return "Attribute does not exist"
def __get__(self, instance, owner):
print("__get__ is called")
return self
class AnotherClass:
attr = MyClass()
obj = AnotherClass()
print(obj.attr) # 调用__getattribute__和__get__方法
print(obj.nonexistent_attr) # 调用__getattribute__和__getattr__方法
```
输出结果:
```
__getattribute__ is called
__get__ is called
<__main__.MyClass object at 0x00000123456789AB>
__getattribute__ is called
__getattr__ is called
Attribute does not exist
```