You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让指定基类的所有子类访问属性时自动执行__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:06:03