2011-03-26 67 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中的嵌套類,除非你有足夠的理由這樣做。