【问题标题】:Splitting a module with 8+ classes into a package with each class in its own file将具有 8 个以上类的模块拆分为一个包,每个类都在自己的文件中
【发布时间】:2010-08-01 06:22:53
【问题描述】:

我有一个包含许多类的模块 (tools.py)。我想将这些提取到它自己的“whyteboard.tools”包中,每个类都在它自己的文件中。

但是,我之前从将所有类都放在一个基本目录中转移到位于项目根目录下的包中,并且在加载以旧格式保存的腌制文件时遇到了问题。 (见:https://stackoverflow.com/questions/2121874)。我不得不在加载文件时对 sys.modules 字典进行修补,然后再将其删除。恶心……

执行此操作的最佳方法是什么?

最好将我的每个类也导入包的__init__ 中,否则我必须这样做

from whyteboard.tools.pen import Pen 

而不是

from whyteboard.tools import Pen

【问题讨论】:

    标签: python package extract


    【解决方案1】:

    我通常看到模块中的 init.py 执行以下操作:

    from whyteboard.tools.pen import *
    

    这样,您始终可以从 whyteboard.tools 导入并引用此模块中的任何类,而无需知道它们的位置。您只需要知道Whyteboard.tools 包提供的类即可。

    【讨论】:

      【解决方案2】:

      执行此操作的最佳方法是什么?

      首先。不。每个文件的类不会有任何改进,那何必呢?

      在加载以旧格式保存的腌制文件时遇到问题

      正确。您必须在加载以旧格式腌制的文件时遇到问题,因为类名已更改。

      如果造成问题,为什么要更改它们?

      如果您绝对必须更改它们,您可以尝试这样的转换。节省猴子补丁。向您的新架构前进。

      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+ 行表明您可能有其他设计问题。在创建 8 个“每个 1 类”的文件之前,您可能需要先解决这些问题。

      考虑到一个 200 行的类可能已经做得太多了。您可能希望分解您的类以获得更细粒度的职责。完成之后,您可能会发现您有几个模块——每个模块都有几个类。

      您可能希望将相关类的集合分解为可重用的模块。一个简单的“每个文件一个类”的方法可能是一种糟糕的重组方法。

      【讨论】:

      • 我的课程越来越长(1900 行!),我认为最好将相关的课程拆分到自己的模块中
      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2013-03-22
      • 2018-10-05
      • 2015-03-06
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多