Python pickle序列化类对象后反序列化为何与原类属性同步且ID相同?
现象原因解析
1. pickle序列化类对象的核心规则
pickle处理类对象时的序列化逻辑和普通类实例完全不同:
- 执行
pickle.dumps(类对象)时,不会存储类当前的所有属性状态,仅会保存类所属的模块名、类的名称两个标识信息 - 执行
pickle.loads()反序列化时,不会创建全新的类对象,而是直接到对应模块中查找当前已存在的同名类,返回该类对象的引用
2. 测试结果的直接解释
你序列化类T后修改了原类的version属性,反序列化阶段pickle直接返回了当前内存中已经被修改过的T类的引用,因此:
PT和T是完全相同的类对象,自然id(PT) == id(T)返回True- 两者是同一个对象的不同别名,所以
PT.version读取到的就是修改后的2.0,而非序列化时的1.0
3. Python类对象的单例特性
在同一个进程的同一模块作用域下,同名类默认就是唯一的类对象,正常定义、导入、反序列化得到的同名类都是同一个对象的引用,表现和单例一致。只有手动通过type动态生成新类、使用元类创建、或者深度拷贝类对象时,才会生成独立的新类对象。
内容的提问来源于stack exchange,提问作者user17189165
相关产品推荐
相关产品推荐

