Python 是否可以使用isinstance或类似的类型检查来处理我的pickle类?

Python 是否可以使用isinstance或类似的类型检查来处理我的pickle类?,python,class,pickle,typechecking,isinstance,Python,Class,Pickle,Typechecking,Isinstance,我有一个非常讨厌的bug,我终于找到了它 我使用(或者更准确地说,我已经使用)一个独立的脚本来创建对象存储,然后对这个数据结构进行pickle。然后,每次程序运行时,我都可以用反序列化的数据初始化主程序 但是,如果使用类型检查,这将成为一个问题。在我完成pickle.dump()并获得这个数据结构之后,我对它进行了设置,以便我尝试检查其中一个对象的类型。不幸的是,我唯一可以检查它的地方是重新加载我的类,Python认为这是不同的 调试:我正在类型检查的对象:>>Fixture{name:'前台'

我有一个非常讨厌的bug,我终于找到了它

我使用(或者更准确地说,我已经使用)一个独立的脚本来创建对象存储,然后对这个数据结构进行pickle。然后,每次程序运行时,我都可以用反序列化的数据初始化主程序

但是,如果使用类型检查,这将成为一个问题。在我完成pickle.dump()并获得这个数据结构之后,我对它进行了设置,以便我尝试检查其中一个对象的类型。不幸的是,我唯一可以检查它的地方是重新加载我的类,Python认为这是不同的

调试:我正在类型检查的对象:>>Fixture{name:'前台',location:'0',desc:'前台有一个符号,上面写着…'。
调试:一个通用的游戏对象:>GameObject{name:'',location:'None',desc:'…'}AFAIK,这不可能以任何简单的方式实现;类型检查与在不同会话中pickle的数据不兼容。说到类型检查,我不是一个狂热者,但我喜欢有效的方法

泡菜应该给你同样的类型;它使用与原始类相同的类引用(模块->类定义)。您的代码还有其他问题。类是一个对象。在不同的会话中重新加载模块时,将创建不同的类对象。例如,如果你所说的不同会话是指一个新的口译员,那么你的诊断是错误的。在新的会话中,
pickle
将使用与测试
isinstance()
相同的类来取消pickle。除非在新的会话中同时交换了类。实际上,我真的不知道会话(特别是interepreter)与它有任何直接关系。我只是想强调一个不同会话的事实,因为我特定的酸洗用例必然涉及在一个脚本中加载一次类,然后在另一个脚本中再次加载。抱歉,但您的诊断仍然是错误的。制作一个简单的测试用例。在模块中创建两个类,一个从另一个继承。测试
isinstance()
是否有效。然后对它们进行pickle,并在新的Python解释器会话中再次加载它们。再次测试视觉测试。它会起作用的。你根本没有检查同一个对象。您正在将
fix.Fixture
实例与
game\u对象.GameObject
进行比较。很明显,这些不是同一类型的对象。我认为您误解了代码的作用,这与Pickle无关。也许我不够清楚
isinstance()
,给定
fix.Fixture
的实例和类
game\u object.GameObject
返回
False
。这就是我研究这两个的原因。
fix.Fixture
应该是
game\u object.GameObject
的子类吗?看看我刚刚发布的MRO
fix.Fixture
确实是
game\u object.GameObject
的一个直接子类。但是,这个特定的
fix.Fixture
实例是另一个
game\u object.GameObject
的子类,而不是我比较它的那个。例如,在一个会话中进行pickle,在另一个会话中使用数据,实际上已经加载了两次类,这两次加载分别创建了一个不同的对象。见: