问题 在包中定义类


我正在学习Python,我一直在玩包。我想知道在包中定义类的最佳方法。似乎在包中定义类的唯一方法是在中定义它们 __init__.py 那个包裹。来自Java,我有点想为我的类定义单个文件。这是推荐的做法吗?

我想让我的目录看起来像这样:

recursor/
    __init__.py
    RecursionException.py
    RecursionResult.py
    Recursor.py

所以我可以将我的课程称为 recursor.Recursorrecursor.RecursionException,和 recursor.RecursionResult。这在Python中是可行的还是推荐的?


7516
2018-06-11 16:28


起源

强制性: Python不是Java - Esteban Küber
还可以看看 stackoverflow.com/questions/2339371/... - froadie
是的,你可以,但不,你不应该。


答案:


继续,在单独的模块中定义您的类。然后做 __init__.py 做这样的事情:

from RecursionException import RecursionException
from RecursionResult import RecursionResult
from Recursor import Recursor

这会将每个类导入到包的根命名空间中,因此调用代码可以引用 recursor.Recursor 代替 recursor.Recursor.Recursor

我觉得有必要在这里回应一些其他的评论:Python不是Java。我建议不要在阳光下为每个类创建一个新模块,而是将密切相关的类分组到一个模块中。以这种方式理解您的代码更容易,并且调用代码不需要大量的导入。


9
2018-06-11 18:59



虽然 recursor.Recursor.Recursor 确实有一定的魅力。


这是完全可行的。只需为每个类创建一个新的类模块,并创建您发布的结构。

您还可以创建Recursion.py模块或类似的模块,并在该文件中包含所有3个类。

(我也是Java的新手,我还没有把任何东西放进我的 __init__.py 文件...)


2
2018-06-11 16:30



如果我在上面创建目录布局,在Recursor.py文件中定义我的Recursor类,我尝试导入“recursor.Recursor”,我得到一个ImportError。我究竟做错了什么? - Naftuli Kay
@rfkrocktk - 您可能必须指定recursor.Recursor.Recursor ...第一个用于包,第二个用于模块(文件),第三个用于实际类...(有时最好考虑使用模块作为包...而不是包含这三个类作为单独文件的包recursor,你可以有一个包含这3个类的模块recursor) - froadie


在Python中,您不仅限于为每个文件定义1个类,而且很少有人这样做。如果你愿意,你可以 - 这完全取决于你。 Python中的Package只是一个带有的目录

__init__.py 

文件。您不必在该文件中放置任何内容即可控制导入的内容等。


1
2018-06-11 16:31