【问题标题】:Organising my Python project组织我的 Python 项目
【发布时间】:2010-09-28 08:36:31
【问题描述】:

我正在启动一个 Python 项目,并希望其中包含 20 个或更多类。作为一种好的做法,我想将它们分别放在一个单独的文件中。但是,项目目录很快就会被文件淹没(或者当我这样做时)。

如果我将要导入的文件放在文件夹中,我将无法再导入它。如何从另一个文件夹导入文件,现在我需要引用它包含的不同类吗?

提前致谢

【问题讨论】:

    标签: python project-organization


    【解决方案1】:

    在你的项目文件夹中创建一个__init__.py 文件,它将被Python视为一个模块。

    然后可以使用以下语法导入包目录中的类:

    from package import class
    import package.class
    

    __init__.py 中,您可以创建一个定义from package import * 行为的__all__ 数组:

    # name1 and name2 will be available in calling module's namespace 
    # when using "from package import *" syntax
    __all__ = ['name1', 'name2'] 
    

    这里是way more information than you even want to know about packages in Python

    一般来说,了解如何组织大量代码的一个好方法是选择一个流行的 Python 包,看看他们是如何做到的。对于初学者,我会查看 DjangoTwisted

    【讨论】:

    • 我应该在这个 __init.py 文件中放什么吗?
    • 我认为它可以是空的。 python.org/doc/2.1.3/tut/…
    • 嘿 - 它是 init.py,我正在尝试绕过 SO 的格式。
    • 注意:init.py,两个前导下划线和两个尾随下划线。 (不确定 SO 是否只是将您的消息格式错误,但想确认一下)。
    • 三联画:不用了,我替你逃了。如果你愿意,我可以回滚吗?
    【解决方案2】:

    “作为一种好的做法,我想将它们分别放在一个单独的文件中。”

    这实际上不是一个很好的做法。您应该设计包含密切相关类的模块。

    实际上,没有一个类实际上是完全独立的。通常,类以逻辑相关的集群或组的形式出现。

    【讨论】:

    • 我一直觉得每个文件一个类是 Java 语言的错误特征。也许是出于好意,但仍然如此。
    • @Ben Blank:当您拥有一种非常复杂的语言和非常慢的编译器时,每个文件都有一个公共类。如果你简化你的语言,你会得到更快的编译器,而且你不需要那种管理技巧。
    【解决方案3】:

    简单的答案是在您创建的新文件夹中创建一个名为__init__.py 的空文件。然后在您的顶级 .py 文件中包含以下内容:

    import mynewsubfolder.mynewclass
    

    【讨论】:

      【解决方案4】:

      Python 不会强迫您使用 Java 令人讨厌的每个文件一个类的风格。事实上,除非它们很大,否则将每个类放在单独的文件中甚至都不是一种好的风格。 (如果它们很大,您可能无论如何都必须进行重构。)相反,您应该将类​​似的类和函数分组到模块中。例如,如果您正在编写 GUI 计算器,您的包布局可能如下所示:

      /amazingcalc
         /__init__.py # This makes it a Python package and importable.
         /evaluate.py # Contains the code to actually do calculations.
         /main.py # Starts the application
         /ui.py # Contains the code to make a pretty interface
      

      【讨论】:

      • 它们最终可能会相当大
      • @Teifion:大吗?如果一个类是“大”的(即数百行代码),它可能做的太多了。好的做法是将这么大的类分解成更容易理解的东西。与使用多个文件无关。
      猜你喜欢
      • 2012-10-21
      • 2011-07-06
      • 1970-01-01
      • 2013-05-27
      • 2016-12-20
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多