组织我的Python项目

46

我正在启动一个Python项目,预计会有20个或更多的类。作为良好的实践,我希望将它们分别放在单独的文件中。然而,当我这样做时,项目目录很快就会被文件淹没。

如果我把要导入的文件放到一个文件夹中,我就不能再导入它了。如何从另一个文件夹中导入文件?现在它在文件夹中,我需要以不同的方式引用它包含的类吗?

先感谢您的回答。

4个回答

31
在你的项目文件夹中创建一个名为__init__.py的文件,Python会将其视为模块。
然后可以使用如下语法导入包目录中的类:
from package import class
import package.class

__init__.py 中,你可以创建一个 __all__ 数组,来定义 from package import * 行为。
# name1 and name2 will be available in calling module's namespace 
# when using "from package import *" syntax
__all__ = ['name1', 'name2'] 

这里有与Python包相关的远超你所需的更多信息

通常来说,学习如何组织大量代码的好方法是选择一个流行的Python包并观察它们是如何实现的。我建议先看看DjangoTwisted


我应该在这个__init__.py文件中放置什么内容? - Teifion
我认为它可以为空。http://www.python.org/doc/2.1.3/tut/node8.html#SECTION008400000000000000000 - David Poole
嘿 - 这是 init.py,我正在尝试绕过SO的格式。 - Kenan Banks
1
注意:init.py,前面和后面各有两个下划线。 (不确定SO是否只是格式化了您的消息,但我想确保一下)。 - chroder
三联画:不用了,我已经替你逃脱了。如果你愿意的话,我可以回滚? - Ali Afshar

22

"按照良好的实践,我希望将它们分别放在单独的文件中。"

实际上这并不是一个非常好的做法。你应该设计包含相关类的模块。

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


3
我一直认为Java语言的一个误区是每个文件只有一个类。也许这是出于好意,但我仍然这么认为。 - Ben Blank
2
@Ben Blank:每个文件一个公共类是在你有非常复杂的语言和非常慢的编译器时所做的。如果你简化你的语言,你会得到更快的编译器,而且你不需要那个管理上的黑客。 - S.Lott

12

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
2
@Teifion:大?如果一个类“大”(即,有很多行代码),那么它可能做了太多的事情。良好的实践是将这样一个大类分解成更容易理解的东西。这与使用许多文件无关。 - S.Lott

6

简单的答案是在你新建的文件夹中创建一个名为__init__.py的空文件。然后在你的顶层.py文件中使用类似以下的语句引入:

import mynewsubfolder.mynewclass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接