应通过__getstate__排除指定属性实现过滤,需配对实现__setstate__;或自定义__deepcopy__精确控制各字段拷贝方式;也可预处理容器再深拷,或改用.copy()、不可变设计等更优方案。

要过滤掉不需要拷贝的属性,核心在于控制对象序列化或复制时的状态表示——不是靠“删字段”,而是让 copy.deepcopy 或 pickle 本身跳过那些字段。
用 __getstate__ 排除指定属性
这是最常用、最规范的方式。当对象被深拷贝或序列化时,Python 会先调用 __getstate__ 获取要保留的属性字典。你只需在这个方法里剔除不想拷贝的项。
- 返回一个新字典,只包含你想保留的属性(比如去掉
self._cache、self.logger、self.lock等) - 必须配对实现
__setstate__,确保反序列化时能正确重建对象(即使某些字段被跳过) - 注意:如果原
__dict__含不可序列化对象(如threading.Lock),不处理就会报错;提前过滤可避免 TypeError
自定义 __deepcopy__ 精确控制拷贝逻辑
比 __getstate__ 更底层、更灵活。你可以决定每个属性是深拷、浅拷、复用,还是直接忽略。
- 在方法内显式调用
copy.deepcopy(value, memo)处理需要深拷的字段 - 对日志器、连接池、线程锁等资源型属性,直接赋值原引用(
new_obj.logger = self.logger),避免重复初始化或报错 - 对临时计算结果、缓存、UI 句柄等,干脆不复制(不写入 new_obj 对应属性)
对内置容器做预处理再拷贝
如果只是临时处理某个 dict 或 list 实例,而非修改类定义,可在调用 deepcopy 前手动清理:
- 构造新字典:
safe_dict = {k: v for k, v in original_dict.items() if k not in {'_temp', 'logger'}} - 再对
safe_dict调用copy.deepcopy() - 适用于一次性场景,不改变原始类行为,但无法解决嵌套对象里的敏感字段
避开 deepcopy,改用更可控的方案
某些场景下,deepcopy 本身就不合适(比如含 NumPy 数组、文件句柄),这时主动绕开更稳妥:
- NumPy 数组优先用
.copy()方法,它明确复制数据内存,不会共享视图 - 配置类对象可设计成不可变(frozen dataclass),天然杜绝意外修改,也无需深拷
- 状态类拆分为「可序列化数据」+「运行时资源」两部分,只拷贝前者











