【问题标题】:Should I create each class in its own .py file?我应该在自己的 .py 文件中创建每个类吗?
【发布时间】:2015-09-24 20:20:37
【问题描述】:

总的来说,我对 Python 还是很陌生。

我知道我可以在同一个 .py 文件中创建多个类,但我想知道是否应该在自己的 .py 文件中创建每个类。

例如,在 C# 中,我将有一个处理所有数据库交互的类。然后是另一个具有业务规则的类。

在 Python 中是这样的吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    没有。典型的 Python 风格是将相关的类放在同一个模块中。一个类可能最终成为一个自己的模块(特别是如果它是一个大类),但它本身不应该是一个目标。并且当你这样做时,请不要在类之后命名模块 - 你最终只会让自己和其他人混淆哪个是哪个。

    【讨论】:

    • 来自 Java 我也有同样的问题,我有一段时间感到困惑。 :-)
    • 有趣的是,PyDev 让您可以选择这样做。
    • 如果从包含多个类的文件中导入一个类,解释器不会执行该文件中的所有类吗?
    • 这取决于您所说的“执行”。是的,出现在全局命名空间中的“类”语句被执行。这就是类的定义方式,通过执行它们的“类”语句。它不会实例化它们,如果类定义过于昂贵,您需要担心的不仅仅是模块中有多少类。
    【解决方案2】:

    每个 .py 文件代表一个模块,因此您应该将函数、常量和类的逻辑组放在同一个文件中。

    .py 文件中的每个类只会在你的模块表中创建史诗般的膨胀,因为如果你只对一个类感兴趣,你仍然可以

    from whatever import SomeClass
    

    【讨论】:

    • Python风格通常使用lowercase作为模块名,CapWords作为类名:python.org/dev/peps/pep-0008
    • 有时候风格很傻。如果你有一个类 Foo,继续把它放在模块 Foo.py 中。为什么要把它放在小写的 foo.py 中?所以你可以写from foo import Foo?通过在模块中写__all__ = ['Foo'],然后可以输入from foo import *from Foo import *,就不会混淆了。所以如果只包含一个类,小写的模块名称是愚蠢的。
    【解决方案3】:

    我会不同意其他人的意见并同意。对我来说,我将每个类放在自己的文件(模块)中取得了更好的成功。但也有例外,所以让我用一个例子来解释一下。

    如果你有一个 Foo 类,那么将它放在一个名为 Foo.py 的文件中,包含以下部分:

    1. 进口
      • 这是您引入依赖项的地方。
      • 示例:import mathfrom Bar import *
    2. 全局变量
      • 您可以在此处定义模块的外部接口,这些接口是该模块外部可见的所有符号。
      • 示例:__all__ = ['Foo']
      • 这也是您可以定义全局变量(坏)和全局常量(好)的地方。这些全局变量不需要导出;可以将它们设为全局,仅是为了简化代码。
      • 示例:PI = 3.14159 表示您可以编写 PI,而如果您在 Foo 类中定义它,则需要编写 Foo.PI
    3. 功能
      • 您可以在此处定义与类 Foo 相关但不属于类 Foo 命名空间的所有顶级函数。这些可能很少见,因为类同时允许 @staticmethods 和内部类。
      • 示例:def print_foo(foo): print(foo)
      • 示例:class Foo(object): pass

    有时您会希望在同一个模块中放置多个类。每当两个或多个类在概念上与您几乎总是一起使用它们并且从不独立使用它们的点相关时,您应该这样做。这是例外,而不是常态。在这种情况下,将所有类名添加到 __all__ 全局。

    最后,对于每个模块 Foo.py,都应该有一个对应的单元测试模块 testFoo.py。

    【讨论】:

    • 单元测试模块应该是模块的精确副本吗?你还会在里面放什么?
    【解决方案4】:

    还有一点值得一提的是,如果文件变得太大,您可以随时将其转换成一个包,从而在不破坏客户端代码的情况下轻松重组。

    【讨论】:

    • 一个包就是多个文件(多个模块)。所以你的回答基本上是说是的,当代码量太大时,每个类都应该放在自己的文件(模块)中。
    【解决方案5】:

    可能不会。 Python 文件是“模块”。模块应该只包含可以独立重用的代码。如果这包括几个类,这是常态,那完全没问题。

    【讨论】:

      【解决方案6】:

      是的,每个类都在自己的文件中。即使在具有多个类的文件中导入单个类(或函数)也会导致 python 执行文件中所有类的定义。试试这个:

      manyClass.py

      class foo():
         print 'a bunch of time consuming work'
      
      class tryme():
         print 'try me'
      

      现在在解释器 shell 中输入这个...

      从 manyClasses 导入 tryme

      一堆耗时的工作
      试试我

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 2011-11-01
        • 2017-07-04
        • 1970-01-01
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多