寄生式继承适合轻量临时对象增强,不推荐构建稳定类体系;其本质是基于现有对象动态添加属性方法,优点是简单隔离,缺点是函数无法复用、逻辑分散、不支持instanceof;应优先组合而非继承,用鸭子类型替代硬类型检查。

寄生式继承本身不是主流推荐的方案,它更适合轻量、临时性的对象增强,而不是构建稳定可复用的类体系。而封装实现对象扩展,关键在于控制属性边界、避免意外污染,同时保留灵活添加能力。
寄生式继承的特点与适用场景
寄生式继承本质是:先用某种方式(比如 Object.create)创建一个新对象,再往这个对象上动态添加方法或属性,最后返回它。它不依赖构造函数或原型链,而是“寄生”在已有对象之上做增强。
- 优点:写法简单,能快速为单个对象注入行为;不改变原对象结构,隔离性好
- 缺点:每次都会新建函数实例,无法复用;所有增强逻辑散落在调用处,难维护;不支持 instanceof 检查,类型系统弱
- 典型用法:适合工具函数包装、一次性数据处理对象、配置对象增强,不适合长期存在的业务实体
用封装控制对象属性扩展
直接给对象加属性(如 obj.newField = 1)看似方便,但会破坏封装一致性。更稳妥的方式是在类定义阶段就预留可控扩展机制。
- 用 __slots__ 明确限定允许的属性名,防止随意新增字段(Python)
- 提供统一的 set_attr(key, value) 方法,在内部校验后再赋值,把扩展入口收束
- 对敏感字段用私有命名(如 __price)+ getter/setter,让外部只能通过接口修改
- 若需动态字段,可内置一个 _metadata 字典,专门存放扩展属性,与核心字段分离
绕过 isinstance 的封装增强技巧
当必须让封装对象通过类型检查时,不能只靠组合,得让 Python 认出它是“那个类”。有几种轻量办法:
- 类装饰器:在类定义后动态注入方法,不改类本身,isinstance 依然有效
- 元类:在类创建时统一加工,比如自动加日志或验证逻辑,实例仍属原类
- 代理类继承目标类:让代理类显式继承原类(class Wrapper(Original):...),再重写 __getattr__ 转发调用,既扩展功能又保类型
实际建议:优先组合,谨慎继承
多数时候,与其费力让封装对象“假装”是某个类,不如重构调用方——把依赖 isinstance 的硬检查,换成鸭子类型判断(比如 hasattr(obj, 'save') 或 try/except)。这样更符合 Python 哲学,也更容易测试和替换。


















