将具有8个以上类的模块拆分为包,每个类都在自己的文件中

时间:2010-07-31 20:17:42

标签: python package extract

我有一个包含许多类的模块(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

2 个答案:

答案 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行的课程可能已经做得太多了。您可能希望将类分解为具有更细粒度的职责。完成后你可能会发现你有几个模块 - 每个模块都有几个类。

您可能希望将相关类的集合分解为可重用模块。简化的“每个文件类别”方法可能是重构这种方法的一种不好的方式。