酸洗内部课程

cls*_*udt 2 python pickle

我有一个python模块model,基本上有以下内容:

class Database:

    class Publiation(object):
        pass

    class Article(Publication):
        pass

    class Book(Publication):
        pass

class AnotherDatabase:

    class Seminar(object):
        pass

    ...
Run Code Online (Sandbox Code Playgroud)

我将数据库中的对象定义为嵌套在主类下的类,以便更有特色地组织它们.从大型XML文件解析对象,这需要时间.我想挑选导入的对象,以便在更短的时间内加载它们.

我收到错误:

pickle.PicklingError:不能pickle:它找不到project.model.Article

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

Elo*_*off 5

创建内部类时,解释器无法知道其内部定义的类,此信息不会被记录.这就是为什么pickle不知道在哪里寻找类文章.

因此,使用内部类时存在许多问题,而不仅仅是在酸洗时.如果模块范围内的类具有相同的名称,则会引入很多歧义,因为没有简单的方法可以区分这两种类型(例如,使用repr或调试时).

因此,除非您有充分的理由这样做,否则通常最好避免使用Python中的嵌套类.