我正在尝试用Python构建我的应用程序。从C#/ Java背景回来,我喜欢每个文件一个类的方法。我希望我的项目树看起来像这样:
[Service]
[Database]
DbClass1.py
DbClass2.py
[Model]
DbModel1.py
DbModel2.py
TheService.py
[ServiceTests]
[Database]
DbClass1Tests.py
DbClass2Tests.py
[Model]
DbModel1Tests.py
DbModel2Tests.py
TheServiceTests.py
是否可以以这样的方式创建包/模块,以便包像Java的包或.NET的命名空间一样工作,即在DbModel1Tests.py中:
import Service.Model
def test():
m = DbModel1()
答案 0 :(得分:13)
Q1。您可以在Python中使用每个文件样式的1类,但这很不寻常。
Q2。你必须使用from Service.Model import *
并在Service/Model/__init__.py
中做一些通常不赞成的事情。避免使用Python中的import *
我个人对此的建议:Python 不是 C#/ Java。试图弯曲它使它看起来像$ other_language将导致沮丧和糟糕的用户体验。
请记住:
Service.Model.DbModel1 import DbModel1
的from service.model import DbModel1
:避免文件名和目录名中的大写字母,并在逻辑上将类/函数分组到文件中(而不是像在每个文件系统中使用1类一样将它们分组到目录中。)答案 1 :(得分:5)
在我看来,1:我不明白为什么不。我认为,无论语言如何,这都是一个好主意,因为它可以让您快速了解文件中的内容,当您知道文件中只有一个类时。我会为helper类做一个小例外,但是由于Python允许嵌套类,所以也可以很好地完成。
2:也可能。在您的示例中,您可以简单地加载模块,从而使其类和函数可以通过完整的命名空间使用。
因此,如果您说import Service.Model
,则只能使用m = Service.Model.DBModel1()
来访问该课程。
要将内容导入当前名称空间,请执行from Service.Model import *
(如果您只需要该类,请执行from Service.Model import DBModel1
)。然后你就可以像现在这样做:m = DBModel1()
。
答案 2 :(得分:3)
每个模块可以有一个类,但这不是必需的。我会说它与每个模块的长度更相关(保持它们不会太长总是一个好主意)。
现在,关于你的结构:
__init__.py
文件。from Service.Model import DbModel
并在编写时使用此代码:m = DbModel1.DbModel1Class()
注意:
service.model.dbModel1.DbModel1()
。from Service.Model import DbModel1
直接从DbModel1
模块导入课程。这可以通过正确设置__init__.py
内容来完成(我不知道如何准确配置它)。 Some more informations here. 答案 3 :(得分:0)
python系统是一组模块,每个模块都有一个目标,因此您需要使用最合适的方法来达到目标,它包含每个模块一个类或每个模块包含功能和类的组合。