2010-06-11 58 views
10

我在学习Python,我一直在玩包装。我想知道在包中定义类的最佳方式。看来在包中定义类的唯一方法是在该包的__init__.py中定义它们。来自Java,我很想为我的类定义单个文件。这是推荐的做法吗?定义包中的类

我想有我目录看起来有点像这样:

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

所以,我可以参考我的类作为recursor.Recursorrecursor.RecursionExceptionrecursor.RecursionResult。这是可行或建议在Python?

+4

Obligatory:[Python不是Java](http://dirtsimple.org/2004/12/python-is-not-java.html) – voyager 2010-06-11 17:09:55

+0

也检查出http://stackoverflow.com/questions/2339371/ as-a-java-programmer-learning-python-what-should-i-look-out-for – froadie 2010-06-11 17:16:01

+2

是的,你可以,但不是你不应该。 – 2010-06-11 19:02:55

回答

8

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

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

这将导入每个类到包的根命名空间,所以调用代码可以参考recursor.Recursor而不是recursor.Recursor.Recursor

但我觉得需要在这里回应一些其他评论:Python不是Java。我建议将紧密相关的类组合到一个模块中,而不是为每个阳光下的课程创建一个新模块。以这种方式理解你的代码会更容易,调用代码不需要bazillion进口。

+4

虽然'recursor.Recursor.Recursor'确实有一定的魅力。 – Ricky 2014-03-07 21:00:35

2

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

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

(我也是新来的Python从Java,而我还没有放任何东西在我__init__.py文件...)

+0

如果我在上面创建了目录布局,在Recursor.py文件中定义我的Recursor类,并尝试导入“recursor.Recursor”,我得到一个ImportError。我究竟做错了什么? – 2010-06-11 17:20:54

+0

@rfkrocktk - 您可能必须指定recursor.Recursor.Recursor ...第一个为包,第二个为模块(文件),第三个为实际类...(有时候最好考虑使用模块排序为包...而不是包含这3个类的包recursor作为单独的文件,您可以有一个模块recursor与这3个类在里面) – froadie 2010-06-11 17:22:57

1

在Python你不限制为每个文件和一些定义1级去做。你可以,如果你想 - 虽然完全取决于你。 Python中的包只是一个目录,其中包含一个

__init__.py 

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