11. 属性访问与控制运算符的重载

作用

对 Python 中的对象的属性的取值、赋值、删除属性进行管理,能够动态管理对象属性的取值和赋值。

属性访问与控制运算符的重载的方法用四个,分别是:__getattribute__,__getattr__,__setattr__,__delattr__

属性访问与控制运算符的重载的方法:

方法名
运算符和表达式
说明
__getattribute__(self, item)
x = self.item
动态检查 item 属性,并返回 item 的值。
__getattr__(self, item)
x = self.item
访问不存在的属性时调用此方法。
__setattr__(self, key, value)
self.key = value
设置属性时调用(包括初始化时的赋值)。
__delattr__(self, key)
del self.key
用 del 语句删除属性时调用,如: del obj.key

索引和切片运算符重载使用相同的方法。

__getattribute__(self, item) 方法详解

作用:

在访问任何属性时被调用(无论访问属性还是调用方法都会调用,不管属性是否存在)。

触发条件

所有属性访问(包括 obj.x、obj.method())。

用途:

访问任何属性时调用,拦截访问控制并处理。

注意事项

内部访问属性时需显式调用父类的 __getattribute__ 方法,如 super().__getattribute__() 来避免递归。

__getattr__(self, item) 方法详解

作用

当访问对象的不存在的属性时被调用。

触发条件

仅当普通属性查找(如实例字典、类继承链)失败时或 __getattribute__ 方法引发 AttributeError 调用。

用途

动态生成属性、实现懒加载或友好的错误提示。

__setattr__(self, key, value) 方法详解

作用

在设置任何属性(包括初始化时的属性)时被调用。

触发条件

对属性的赋值操作(如 obj.x = y)。

用途

拦截属性赋值,实现验证、日志记录或自动触发操作。

注意事项

内部赋值需通过 self.__dict__super() 避免递归。

__delattr__(self, key) 方法详解

作用

在删除属性时被调用(如 del obj.x)。

触发条件

执行 del 操作时。

用途

阻止删除关键属性或执行清理操作。