如何让指定基类的所有子类访问属性时自动执行__getattribute__自定义逻辑
方案1(无特殊约束时的最优选择:原生继承)
你当前的基类写法已经天然满足需求,无需额外修改。
Python的继承机制会自动将父类的__getattribute__方法传递给所有子类,只要子类没有显式定义同名的__getattribute__方法,访问子类实例的任何属性时都会自动触发父类中定义的日志/校验逻辑。
示例验证代码:
# 你原来的基类 class DummyBaseClass: def __getattribute__(self, name): # 你的日志/校验逻辑 print(f"正在访问属性:{name}") return object.__getattribute__(self, name) # 子类不需要额外写__getattribute__ class SubClass(DummyBaseClass): def __init__(self): self.data = "测试数据" self.count = 10 # 测试 obj = SubClass() print(obj.data) # 输出: # 正在访问属性:data # 测试数据 print(obj.count) # 输出: # 正在访问属性:count # 10
方案2(需要兼容子类可能重写__getattribute__的场景)
如果无法约束子类不重写__getattribute__,担心子类漏写super()调用导致逻辑失效,可以用元类强制给所有子类注入父类的前置逻辑:
class ForceGetattributeMeta(type): def __new__(cls, name, bases, attrs): base_getattr = DummyBaseClass.__getattribute__ # 如果子类自定义了__getattribute__,就包裹一层强制先执行父类逻辑 if '__getattribute__' in attrs: sub_getattr = attrs['__getattribute__'] def wrapped_getattribute(self, name): base_getattr(self, name) return sub_getattr(self, name) attrs['__getattribute__'] = wrapped_getattribute return super().__new__(cls, name, bases, attrs) # 给基类绑定元类 class DummyBaseClass(metaclass=ForceGetattributeMeta): def __getattribute__(self, name): print(f"正在访问属性:{name}") # 你的日志/校验逻辑 return object.__getattribute__(self, name)
这种方案下就算子类自己重写了__getattribute__,父类的逻辑也会被优先执行。
注意事项
- 如果你需要类属性访问也触发该逻辑,需要在元类中额外定义
__getattribute__方法处理类本身的属性访问。 - 编写
__getattribute__时不要直接用self.xxx访问自身属性,会触发无限递归,必须用object.__getattribute__(self, name)或者super().__getattribute__(name)取值。
内容的提问来源于stack exchange,提问作者Chuu
相关产品推荐
相关产品推荐

