建议在单个文件中使用多个类吗?

时间:2009-07-07 11:14:34

标签: python class

  

可能重复:
  How many Python classes should I put in one file?

来自C ++背景我已经习惯于组织我的课程,因为在大多数情况下,课程与文件之间的比例为1:1。通过使单个文件包含单个类,我发现代码更易于导航。当我向Python介绍自己时,我发现很多例子,其中一个文件包含多个类。这是在Python中推荐的做事方式吗?如果是这样,为什么?

我在PEP8中错过了这个约定吗?

6 个答案:

答案 0 :(得分:53)

以下是一些可能的原因:

  1. Python不仅仅是基于类的 - Python中自然的代码分解单元就是模块。模块就像包含函数(Python中的第一类对象)一样。在Java中,分解的单位是类。因此,Python有一个模块=一个文件,Java有一个(公共)类=一个文件。
  2. Python比Java更具表现力,如果你将自己局限于每个文件一个类(Python不会阻止你这么做),你最终会得到很多非常小的文件 - 更多的是用很少的东西来跟踪益处。
  3. 大致相同功能的示例:Java的log4j =>几十个文件,~8000 SLOC。 Python logging => 3个文件,~2800 SLOC。

答案 1 :(得分:17)

有一句咒语,“扁平比嵌套更好”,这通常会阻止过度使用层次结构。我不确定是否有任何关于何时想要创建新模块的硬性规则 - 在大多数情况下,人们只是使用他们的自由裁量权来对逻辑相关的功能(与特定问题域相关的类和函数)进行分组

thread from the Python mailing list,以及Fredrik Lundh的引用:

  

更重要的是在Python中,   你不要为每一个人使用课程 -   事情;如果你需要工厂,   单身人士,多种创造方式   对象,多态助手等,你   使用普通函数,而不是类或   静态方法。

     一旦你完成了“就是这样的话”   类“,使用模块来组织   事情以一种有意义的方式   使用您的组件的代码   使导入语句看起来很好。

答案 2 :(得分:6)

这本书Expert Python Programming有一些相关的讨论 第4章:选择好名称:“构建命名空间树”和“拆分代码”
我的粗略摘要:将一些相关的类收集到一个模块(源文件),和 将一些相关模块收集到一个包中,有助于代码维护。

答案 3 :(得分:5)

在python中,类也可以用于小任务(仅用于分组等)。保持1:1的关系会导致文件太多,功能很少或很少。

答案 4 :(得分:4)

没有具体的约定 - 做任何事情都会使你的代码最易读和可维护。

答案 5 :(得分:2)

不为每个类提供单独文件的一个很好的例子可能是django应用程序中的models.py文件。每个django应用程序可能有一些与该应用程序相关的类,并将它们放入单个文件中只会使工作更多。

同样,将每个视图再次放在不同的文件中可能会适得其反。