如何装饰Python类并重写方法同时保留原类已创建的实例?
实现方案
你需要的是复用已有类实例、仅改写指定方法逻辑的效果,两种无侵入的实现方式如下:
方式1:代理包装模式(推荐,不修改原实例)
这个方案不会改动你预先创建好的A类实例,仅通过包装层实现方法改写,未被改写的原有方法会自动转发到原实例执行。
首先补全基础类定义做示例:
class A: def sample_method(self): print("原类A自带的sample_method逻辑") def functionInClassA(self): print("原类A的普通业务方法")
编写装饰包装类:
class DecoratedA: def __init__(self, a_instance: A): # 持有预先创建的A类实例引用 self._original_a = a_instance def sample_method(self): # 这里写你自定义的重写逻辑即可,如果需要调用原方法可以用self._original_a.sample_method() print("重写后的sample_method逻辑") def __getattr__(self, attr_name): # 所有当前类没定义的属性、方法,全部转发给原A实例执行 return getattr(self._original_a, attr_name)
符合你预期的调用效果:
# 预先创建好的A实例 a = A() decorated_a = DecoratedA(a) decorated_a.functionInClassA() # 输出:原类A的普通业务方法,完全复用原实例逻辑 decorated_a.sample_method() # 输出:重写后的sample_method逻辑
方式2:动态修改实例类(适合允许修改原实例的场景)
如果你更习惯继承写重写逻辑的方式,可以直接修改已有实例的类指向,不需要重新实例化对象:
class DecoratedA(A): def sample_method(self): print("继承重写的sample_method逻辑") a = A() # 直接把已有实例的类绑定到装饰后的子类 a.__class__ = DecoratedA a.functionInClassA() # 原有方法正常调用 a.sample_method() # 走重写后的逻辑
注意事项
- 你最开始写的类方法定义漏了第一个参数
self,直接运行会报参数不匹配的错误,所有实例方法都需要把self作为第一个参数 - 代理模式不会改动原实例
a的任何行为,原实例和包装后的decorated_a互相独立;动态改类的方式会直接把原实例变成子类实例,根据你的场景选即可
内容的提问来源于stack exchange,提问作者jayleethings
相关产品推荐
相关产品推荐

