在包中定义类
Posted
技术标签:
【中文标题】在包中定义类【英文标题】:Define Classes in Packages 【发布时间】:2011-03-02 18:06:55 【问题描述】:我正在学习 Python,并且一直在玩包。我想知道的最佳方法。似乎的唯一方法是在该包的__init__.py
中定义它们。来自 Java,我有点想为我的类定义单独的文件。这是推荐的做法吗?
我想让我的目录看起来像这样:
recursor/
__init__.py
RecursionException.py
RecursionResult.py
Recursor.py
所以我可以将我的课程称为recursor.Recursor
、recursor.RecursionException
和recursor.RecursionResult
。这在 Python 中可行或推荐吗?
【问题讨论】:
必填:Python is not Java 另请查看***.com/questions/2339371/… 可以,但不应该。 【参考方案1】:这是完全可行的。只需为每个类创建一个新的类模块,并准确创建您发布的结构。
您也可以创建一个 Recursion.py 模块或类似的东西,并在该文件中包含所有 3 个类。
(我也是从 Java 开始接触 Python 的新手,我还没有在我的 __init__.py
文件中添加任何内容...)
【讨论】:
如果我创建上面的目录布局,在 Recursor.py 文件中定义我的 Recursor 类并尝试导入“recursor.Recursor”,我得到一个 ImportError。我做错了什么? @rfkrocktk - 您可能必须指定 recursor.Recursor.Recursor... 第一个用于包,第二个用于模块(文件),第三个用于实际类... (有时最好考虑将模块用作包......而不是将这 3 个类作为单独文件的包递归器,您可以在其中包含这 3 个类的模块递归器)【参考方案2】:在 Python 中,您不仅限于为每个文件定义 1 个类,而且很少有人这样做。如果你愿意,你可以 - 这完全取决于你。 Python 中的 Package 只是一个带有
的目录__init__.py
文件。您无需在该文件中添加任何内容即可控制导入的内容等。
【讨论】:
【参考方案3】:继续在单独的模块中定义您的类。然后让__init__.py
做这样的事情:
from RecursionException import RecursionException
from RecursionResult import RecursionResult
from Recursor import Recursor
这会将每个类导入包的根命名空间,因此调用代码可以引用recursor.Recursor
而不是recursor.Recursor.Recursor
。
不过,我觉得有必要在此附和其他一些 cmets:Python 不是 Java。我建议将密切相关的类分组到一个模块中,而不是为每个类创建一个新模块。这样更容易理解您的代码,并且调用代码不需要大量导入。
【讨论】:
虽然recursor.Recursor.Recursor
确实有一定的魅力。以上是关于在包中定义类的主要内容,如果未能解决你的问题,请参考以下文章