我有一个包含许多类的模块(tools.py)。我想将它们解压缩到自己的“whyteboard.tools”包中,每个类都在自己的文件中。
但是,我以前从一个基本目录中的所有类转移到项目根目录下的包中,并且在加载以旧格式保存的pickle文件时出现问题。 (见:https://stackoverflow.com/questions/2121874)。我不得不在加载文件时修补sys.modules dict,然后删除它。讨厌...
采取这一举措的最佳方式是什么?
最好还在包__init__
中导入我的每个课程,否则我必须
from whyteboard.tools.pen import Pen
而不是
from whyteboard.tools import Pen
答案 0 :(得分:2)
我通常看到模块中的 init .py执行类似的操作:
from whyteboard.tools.pen import *
这样,您始终可以从whyteboard.tools导入并引用此模块中的任何类,而无需知道它们的位置。您只需要知道whyteboard.tools包提供的类。
答案 1 :(得分:1)
采取这一举措的最佳方式是什么?
首先。别。每个文件的类不会改进任何东西,所以为什么要这么麻烦?
在加载以旧格式保存的pickle文件时出现问题
正确。您必须在加载以旧格式腌制的文件时遇到问题,因为类名已更改。
为什么要在出现问题时更改它们?
如果您绝对必须更改它们,您可以尝试这样的转换。保存猴子修补。向前迈进新架构。
import this.that.module
import pickle
import os
legacy_obj= pickle.load( someFile )
os.rename( someFile, someFile+".bak")
import this.that.module.class
new_obj= this.that.module.class( legacy_obj )
pickle.save( someFile )
在一个文件中有1900行和8个以上每行200多行的文件之间存在中间地带。单个200+行的类表示您可能有其他设计问题。在创建“每个1类”的8个文件之前,您可能想先解决这些问题。
考虑到200行的课程可能已经做得太多了。您可能希望将类分解为具有更细粒度的职责。完成后你可能会发现你有几个模块 - 每个模块都有几个类。
您可能希望将相关类的集合分解为可重用模块。简化的“每个文件类别”方法可能是重构这种方法的一种不好的方式。