Python中不使用继承或委托复用其他类方法的原理及安全性问询
底层运行逻辑
Python 中的实例方法本质是实现了描述符协议的函数对象,你这种写法的运行逻辑如下:
- 类定义阶段将
Old.a直接赋值给Mine的类属性b时,仅完成了函数引用的传递,没有其他额外执行逻辑 - 当你通过
Mine的实例访问b属性时,Old.a的__get__描述符方法会被触发,将当前Mine实例作为绑定对象传入 - 最终返回的是绑定了
Mine实例的方法对象,调用b()时,这个Mine实例会作为self参数直接传入原Old.a函数执行
你观察到的输出<bound method Old.a of <__main__.Mine object at 0x...>>就是这个逻辑的体现:方法的函数体来自Old.a,但绑定的执行上下文是Mine的实例。
方案安全性说明
这个方案完全符合你提到的不修改旧类代码、不需要实例化旧类、不使用继承的前置要求,只要满足以下条件就可以安全使用:
- 原
Old.a方法中所有通过self访问的属性、调用的实例方法,你的Mine类必须全部提供,属性名、方法签名要完全匹配 - 如果
Old.a中存在通过self.__class__访问类属性、调用类方法的逻辑,你的Mine类也要对应提供相关成员 Old.a中不存在isinstance(self, Old)、self is 某个Old实例这类和Old类型强绑定的判断逻辑,这类逻辑会直接导致运行不符合预期
你目前测试的动态修改self.foo这类场景运行正常,是因为Python默认支持为实例动态绑定属性,只要你的业务场景下Old.a没有上述的强绑定特殊逻辑,这个方案完全可用。
内容的提问来源于stack exchange,提问作者HQSun
相关产品推荐
相关产品推荐

