在包中定义类

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.Recursorrecursor.RecursionExceptionrecursor.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确实有一定的魅力。

以上是关于在包中定义类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在包中使用自定义 USER-Model

我可以在包中嵌入自定义字体并从 ios 框架访问它吗?

在包中覆盖“defun”

golang gin-gonic 和在包中拆分文件

Oracle 错误 PLS-00323:子程序或游标在包规范中声明,必须在包主体中定义

oracle 包中定义全局变量