我有一个名为model
的python模块,基本上有以下内容:
class Database:
class Publiation(object):
pass
class Article(Publication):
pass
class Book(Publication):
pass
class AnotherDatabase:
class Seminar(object):
pass
...
我将数据库中的对象定义为嵌套在主类下的类,以便更有特色地组织它们。从大型XML文件解析对象,这需要时间。我想挑选导入的对象,以便在更短的时间内加载它们。
我收到错误:
pickle.PicklingError:不能发泡 : 它的 找不到project.model.Article
该课程现在为project.model.Article
,而非定义的project.model.Database.Article
。我可以修复此错误并保持类嵌套如上吗?通过嵌套来组织类是不是一个坏主意?
答案 0 :(得分:5)
当创建内部类时,解释器无法知道它内部定义了哪个类,因此不会记录此信息。这就是为什么pickle不知道在哪里寻找类文章。
因此,使用内部类时存在许多问题,而不仅仅是在酸洗时。如果模块范围内的类具有相同的名称,则会引入很多歧义,因为没有简单的方法可以区分两种类型(例如使用repr或调试时)。
因此,除非你有充分的理由这样做,否则通常最好避免使用Python中的嵌套类。
答案 1 :(得分:2)
让你的课程无人问津,这当然要简单得多。作为替代方案,您可以使用包将类组合在一起。
在任何情况下,都有一个名为cerealizer
的备用序列化程序,我认为它可以处理嵌套类。在反序列化之前,您需要使用它注册类。我之前使用它pickle
是不够的(也是与类相关的问题)并且效果很好!
答案 2 :(得分:1)
我在这里回答了类似的问题:https://stackoverflow.com/a/11493777/741316
它不漂亮,但它是可行的。简而言之 - 如果可以的话,请避免嵌套课程。