2010-01-19 79 views
29

我一般对Python很新。我应该在自己的.py文件中创建每个类吗?

我知道我可以在同一个.py文件中创建多个类,但是我想知道是否应该在它自己的.py文件中创建每个类。在C#中,例如,我将有一个处理所有数据库交互的类。然后是另一个拥有商业规则的课程。

这是Python的情况吗?

回答

25

编号。典型的Python风格是将相关的类放在同一个模块中。可能是一个班级以自己的模块结束(尤其是如果它是一个大班级),但它本身不应该是一个目标。当你这样做的时候,请不要在课后给单元命名 - 你最终会把自己和其他人弄混淆,哪个是哪个。

+4

来自Java我有同样的问题,男孩是我困惑了一阵子。 :-) – snarkyname77 2010-01-20 00:54:15

+0

有趣的是,PyDev为您提供了选择。 – Uri 2010-01-20 14:54:19

+0

如果您从多个类文件中导入类,解释器不会执行该文件中的所有类吗? – 2017-06-08 14:09:59

8

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

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

from whatever import SomeClass 
+7

Python风格通常对模块名称使用'小写字母'和类名称使用'CapWords':http://www.python.org/dev/peps/pep-0008/ – 2010-01-19 23:56:07

+0

你绝对正确,我会编辑。 – richo 2010-01-20 01:46:38

+0

有时候风格很傻。如果你有一个Foo类,请继续将它放在模块Foo.py中。你为什么要把它放在小写foo.py中?那么你可以写'从foo import Foo'?通过在模块中写入__all__ = ['Foo']',你可以输入'from foo import *'或'from Foo import *',这样就不会有任何混淆。如果小写模块名称只包含一个类,那么它们很愚蠢。 – 2011-01-12 18:31:45

1

可能不感兴趣。 Python文件是“模块”。模块应该包含哪些代码是独立可重用的。如果这包括几个班级,这是常态,那么这很完美。

3

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

+0

一个包只是多个文件(多个模块)。所以你的答案基本上是说,是的,当代码量太大时,每个类都应该在它自己的文件(模块)中。 – 2011-01-12 18:27:54

2

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

如果你有一个类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。

1

是每个类都在它自己的文件中。在一个带有多个类的文件中导入甚至一个类(或函数)会导致python执行文件中所有类的定义。试试这个:

manyClass.py

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

class tryme(): 
    print 'try me' 

现在,在命令解释器中键入此...

从manyClasses导入tryme

一堆耗时的工作
我试试

相关问题