Python每个模块和包一个类

问题描述 投票:5回答:4

我正在尝试用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()
    
python packages
4个回答
5
投票

我认为:对于1:我不明白为什么不这样做。我认为,不管使用哪种语言,这都是一个好主意,因为当您知道文件中只有一个类时,它可以使您快速了解文件中的内容。尽管我会为辅助类提供一个小例外,但是由于Python允许嵌套类,因此也可以很好地完成。

对于2:也可能。不过,在您的示例中,您可以简单地加载模块,从而使完整的名称空间可以使用其类和函数。

因此,如果您说import Service.Model,则只能使用m = Service.Model.DBModel1()来访问课程。

要将事物导入当前名称空间,请执行from Service.Model import *(如果只需要该类,则执行from Service.Model import DBModel1)。然后,您可以像现在一样进行操作:m = DBModel1()


13
投票

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

Q2。您将不得不使用from Service.Model import *并在Service/Model/__init__.py中做一些通常不被接受的事情。避免在Python中使用import *

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

请记住:

  • 除了Python模块中的类(例如函数)之外,您还可以拥有其他东西”
  • 除非您需要实例化该类,否则不必从模块导入该类。特别是,如果您的代码仅使用DbModel1实例作为参数传递给函数/方法,则无需在该部分代码中进行导入]
  • 来自Service.Model.DbModel1 import DbModel1,看起来很糟。首选from service.model import DbModel1:避免在文件名和目录名中使用大写字母,并在文件中按逻辑对类/函数进行分组(而不是像对每个文件系统使用1个类那样在目录中对它们进行分组。)

3
投票

每个模块可以有一个类,但这不是必需的。我想说这与每个模块的长度有关(保持它们不要太长总是一个好主意)。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.