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 操作时。
用途
阻止删除关键属性或执行清理操作。