Python:每个类只有一个单独的模块(.py文件)吗?

17
我两周前开始学习Python编程。我像在Java或C#等语言中一样,为每个类制作一个单独的文件(模块)。然而,现在,看到其他人的教程和代码,我意识到许多人使用同一文件来定义多个类和主函数,但我不知道他们这样做是因为只是示例还是因为它是Python约定或类似的原因(将许多类定义和分组到同一文件中)。
那么,在Python中,是为每个类创建一个文件,还是如果可以按特定特征分组多个类,则将多个类放到同一文件中?(例如,将机动车辆放在一侧,将所有车辆放在另一侧)。
显然,每个人都有自己的风格,但当我提问时,我希望得到通用答案或约定,无论如何,如果有人想告诉我他自己的风格及其原因,随意发表!;)

2
我认为你得到的任何答案都将是一种观点,没有明确的答案。 - Padraic Cunningham
1
如果您想每个类一个文件,将您的类文件组织到一个目录中,并有一个 __init__.py 文件,其中对于每个类都执行 from ClassName import * 操作。“永远不要这样做”似乎是一个非常轻视的回答,就像任何模式一样,它都有优点和缺点。 - szmoore
3个回答

13

每个类一个文件。

在 Java 中,通常不会在一个文件中放置多个类(当然可以进行嵌套)。

而在 Python 中,如果你将相关的类归为一类,则更好。看一下Python 标准库:许多模块都在一个文件中包含了多个类。

为什么要这样做呢?简单来说就是可读性。我个人喜欢阅读相关或相似代码时无需在文件之间切换。同时这也使得导入更加简洁。

想象一下socketserver.pyUDPServerTCPServerForkingUDPServerForkingTCPServerThreadingUDPServerThreadingTCPServerBaseRequestHandlerStreamRequestHandlerDatagramRequestHandler分散到九个文件中,那么你该如何导入它们呢?难道是这样吗?

from socketserver.tcp.server import TCPServer
from socketserver.tcp.server.forking import ForkingTCPServer
...

这完全是多余的。当你写它时,它是多余的。当你读它时,它也是多余的。这样不是更容易吗?

from socketserver import TCPServer, ForkingTCPServer

话虽如此,如果你将每个类放入单独的文件中,也没有人会阻止你。只是可能不够符合Pythonic


2
但是为什么呢?我的意思是,每个类都有一个文件有什么问题,或者在同一个文件中定义多个类为什么可以呢? - Drumnbass
1
这不是错误,但如果有很多导入的话,它可能会变得非常混乱。 - Morb
2
我也用C++这样做,我把所有相关的类放在同一个文件中。 打开的文件更少,包含的内容更少,找到我想要的类/文件所需的时间更短。 - Morb
1
但是我认为,如果我为每个类创建一个文件,代码看起来可能不太清晰,但我知道在哪里定义了所有的类。如果我为每个文件定义许多类,可能会陷入寻找特定类的混乱中。 - Drumnbass
谢谢@miku。你不会在文件之间切换,但在代码会话中可能会使用CTRL+F数百万次:P但你是对的,这样更易读。 - Drumnbass
显示剩余3条评论

5

Python有包、模块和类的概念。如果你每个模块只放一个类,那么拥有模块的优势就不存在了。如果你有一个很大的类,将这个类放在一个单独的文件中可能是可行的,但是,这样做好吗?不好,它很难测试和维护。最好有更多的小类,每个类专注于特定任务,并将它们逻辑地分组成尽可能少的文件。


2

每个文件一个类并不是错的。Python并不是直接针对面向对象设计,因此你可以在一个文件中使用多个类。

如果您对如何“正确”做事感到困惑,我建议您阅读一些样式指南。

我建议阅读Google的样式指南Python基金会的官方样式指南

您还可以在PEP索引中找到更多关于Python习惯用法和元分析的材料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接