【问题标题】:Are multiple classes in a single file recommended? [duplicate]是否建议在单个文件中包含多个类? [复制]
【发布时间】:2010-11-08 16:06:03
【问题描述】:

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

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

我是否错过了PEP8 中的这个约定?

【问题讨论】:

标签: python class


【解决方案1】:

以下是一些可能的原因:

  1. Python 不仅仅基于类——Python 中代码分解的自然单元是模块。模块和类一样可能包含函数(它们是 Python 中的一等对象)。在Java中,分解的单位是类。因此,Python 有一个模块=一个文件,而 Java 有一个(公共)class=一个文件。
  2. Python 比 Java 更具表现力,如果您将自己限制为每个文件一个类(Python 不会阻止您这样做),您最终会得到很多非常小的文件 - 需要跟踪的文件很少受益。

大致等效功能的示例:Java 的 log4j => 几十个文件,~8000 SLOC。 Python 日志记录 => 3 个文件,~ 2800 SLOC。

【讨论】:

    【解决方案2】:

    有一句格言,“扁平比嵌套更好”,通常不鼓励过度使用层次结构。我不确定何时要创建新模块是否有任何硬性规定——在大多数情况下,人们只是自行决定对逻辑相关的功能(与特定问题域相关的类和函数)进行分组.

    好的thread from the Python mailing list,引用 Fredrik Lundh 的话:

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

    一旦你克服了“这就是一切 类”,使用模块来组织 以一种有意义的方式做事 使用您的组件的代码。
    使导入语句看起来不错。

    【讨论】:

    • 喜欢过度使用层次结构部分的解释。有时,当代码中过度使用层次结构时,很难理解代码。尤其是在没有充分记录的情况下,即使是“hello world”代码也会让人头疼
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        对此没有特定的约定 - 尽一切可能使您的代码最具可读性和可维护性。

        【讨论】:

          【解决方案6】:

          django 应用程序中的 models.py 文件可能是每个类没有单独文件的一个很好的例子。每个 django 应用程序可能有一些与该应用程序相关的类,将它们放入单独的文件中只会增加工作量。

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

          【讨论】:

          • 我不同意。通过在一个文件中包含更多类,您只需将更多类暴露在循环依赖项的影响下,这可能甚至不会成为它们位于不同文件中的问题。但是只有在发生这种情况时才拆分组会导致代码库不一致。
          • 视情况而定。如果您在models.py中谈论多个模型,那么无论如何您都不应该在全局范围内导入其他模型文件(这是过去循环依赖的可靠方式:IIRC django 甚至不会由于检查,现在允许它)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 2013-08-30
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-26
          相关资源
          最近更新 更多