【发布时间】:2015-09-24 20:20:37
【问题描述】:
总的来说,我对 Python 还是很陌生。
我知道我可以在同一个 .py 文件中创建多个类,但我想知道是否应该在自己的 .py 文件中创建每个类。
例如,在 C# 中,我将有一个处理所有数据库交互的类。然后是另一个具有业务规则的类。
在 Python 中是这样的吗?
【问题讨论】:
标签: python
总的来说,我对 Python 还是很陌生。
我知道我可以在同一个 .py 文件中创建多个类,但我想知道是否应该在自己的 .py 文件中创建每个类。
例如,在 C# 中,我将有一个处理所有数据库交互的类。然后是另一个具有业务规则的类。
在 Python 中是这样的吗?
【问题讨论】:
标签: python
没有。典型的 Python 风格是将相关的类放在同一个模块中。一个类可能最终成为一个自己的模块(特别是如果它是一个大类),但它本身不应该是一个目标。并且当你这样做时,请不要在类之后命名模块 - 你最终只会让自己和其他人混淆哪个是哪个。
【讨论】:
每个 .py 文件代表一个模块,因此您应该将函数、常量和类的逻辑组放在同一个文件中。
.py 文件中的每个类只会在你的模块表中创建史诗般的膨胀,因为如果你只对一个类感兴趣,你仍然可以
from whatever import SomeClass
【讨论】:
lowercase作为模块名,CapWords作为类名:python.org/dev/peps/pep-0008
from foo import Foo?通过在模块中写__all__ = ['Foo'],然后可以输入from foo import *或from Foo import *,就不会混淆了。所以如果只包含一个类,小写的模块名称是愚蠢的。
我会不同意其他人的意见并同意。对我来说,我将每个类放在自己的文件(模块)中取得了更好的成功。但也有例外,所以让我用一个例子来解释一下。
如果你有一个 Foo 类,那么将它放在一个名为 Foo.py 的文件中,包含以下部分:
import math、from Bar import *
__all__ = ['Foo']
PI = 3.14159 表示您可以编写 PI,而如果您在 Foo 类中定义它,则需要编写 Foo.PI。@staticmethods 和内部类。def print_foo(foo): print(foo)
class Foo(object): pass
有时您会希望在同一个模块中放置多个类。每当两个或多个类在概念上与您几乎总是一起使用它们并且从不独立使用它们的点相关时,您应该这样做。这是例外,而不是常态。在这种情况下,将所有类名添加到 __all__ 全局。
最后,对于每个模块 Foo.py,都应该有一个对应的单元测试模块 testFoo.py。
【讨论】:
还有一点值得一提的是,如果文件变得太大,您可以随时将其转换成一个包,从而在不破坏客户端代码的情况下轻松重组。
【讨论】:
可能不会。 Python 文件是“模块”。模块应该只包含可以独立重用的代码。如果这包括几个类,这是常态,那完全没问题。
【讨论】:
是的,每个类都在自己的文件中。即使在具有多个类的文件中导入单个类(或函数)也会导致 python 执行文件中所有类的定义。试试这个:
manyClass.py
class foo():
print 'a bunch of time consuming work'
class tryme():
print 'try me'
现在在解释器 shell 中输入这个...
从 manyClasses 导入 tryme
一堆耗时的工作
试试我
【讨论】: