2011-03-26 84 views
2

我有称为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: Can't pickle : it's not found as project.model.Article

此类现在是project.model.Article,定义不project.model.Database.Article。我可以修复这个错误并保持类似上面的类嵌套吗?通过嵌套来组织课程是不是一个好主意?

+1

是嵌套的东西是不好的。如果你“不需要”拥有父母/子女关系,那么你不想这样做。你不想为自己创建一个数独游戏。 – 2011-03-26 16:43:58

回答

1

保持你的类没有变得简单得多。作为替代,您可以使用包将这些类分组在一起。

无论如何,有一个替代序列化程序名为cerealizer,我认为它可以处理嵌套类。在反序列化之前,您需要使用它注册类。我以前用过pickle还不够(还有与类有关的问题),它效果很好!

5

当创建一个内部类时,解释器无法知道它内部定义了哪个类,因此不会记录此信息。这就是为什么泡菜不知道在哪里寻找类文章。

由于这个原因,在使用内部类时有许多问题,而不仅仅是酸洗。如果有类于具有相同名称的模块范围,它引入了一个很大的模糊性,因为没有简单的方法来区别这两种类型(如与再版或调试时)。

因此,它通常是最好避免Python中的嵌套类,除非你有足够的理由这样做。