python __getattr__和__get__
时间: 2023-08-01 21:01:04 浏览: 147
详解Python中 __get__和__getattr__和__getattribute__的区别
`__getattr__`和`__getattribute__`是Python中特殊的方法,用于处理对象的属性访问和获取。
`__getattr__`用于在对象实例的属性不存在时被调用,通常在动态获取属性的情况下使用。当我们尝试访问一个对象上不存在的属性时,Python解释器会自动调用`__getattr__`方法。我们可以在这个方法中定义对不存在属性的处理逻辑,比如返回默认值或者触发异常。
下面是一个示例:
```
class MyClass:
def __getattr__(self, name):
return f"Attribute {name} does not exist."
obj = MyClass()
print(obj.some_attr)
# Output: Attribute some_attr does not exist.
```
`__getattribute__`用于在对象实例的属性被访问时被调用。与`__getattr__`不同,`__getattribute__`会在所有属性访问上被调用,无论属性是否存在。我们可以通过在`__getattribute__`方法中自定义属性访问的行为,比如在访问属性前执行一些操作或返回特定的值。
下面是一个示例:
```
class MyClass:
def __getattribute__(self, name):
print(f"Accessing attribute {name}")
return super().__getattribute__(name)
obj = MyClass()
print(obj.some_attr)
# Output:
# Accessing attribute some_attr
# None
```
注意,使用`__getattribute__`时需要谨慎,因为在方法内部访问同个实例的其他属性时可能会触发无限递归调用。在这种情况下,可以通过使用`super()`来避免无限递归。
综上所述,`__getattr__`和`__getattribute__`是Python中用于处理对象属性访问和获取的特殊方法,分别用于处理不存在属性和所有属性的访问。
阅读全文