Python每个模块和包一个类

时间:2011-11-09 08:03:59

标签: python packages

我正在尝试用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
  1. Python中每个文件的一个类是否正常?
  2. 是否可以以这样的方式创建包/模块,以便包像Java的包或.NET的命名空间一样工作,即在DbModel1Tests.py中:

    import Service.Model
    
    def test():
       m = DbModel1()
    

4 个答案:

答案 0 :(得分:13)

Q1。您可以在Python中使用每个文件样式的1类,但这很不寻常。

Q2。你必须使用from Service.Model import *并在Service/Model/__init__.py中做一些通常不赞成的事情。避免使用Python中的import *

我个人对此的建议:Python 不是 C#/ Java。试图弯曲它使它看起来像$ other_language将导致沮丧和糟糕的用户体验。

请记住:

  • 你可以拥有Python模块中的其他东西(例如函数)
  • 除非需要实例化该类,否则不必从模块导入类。特别是,如果您的代码仅使用DbModel1的实例作为参数传递给您的函数/方法,则不需要在代码的该部分中导入
  • 来自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()

注意:

  • 用首字母命名你的文件大写不是Pythonic(但是类名应该有它)。这意味着它应该看起来像service.model.dbModel1.DbModel1()
  • 您可以from Service.Model import DbModel1直接从DbModel1模块导入课程。这可以通过正确设置__init__.py内容来完成(我不知道如何准确配置它)。 Some more informations here.

答案 3 :(得分:0)

python系统是一组模块,每个模块都有一个目标,因此您需要使用最合适的方法来达到目标​​,它包含每个模块一个类或每个模块包含功能和类的组合。