在Python中,“from Module import ClassName”是典型用法吗?

3 投票
4 回答
609 浏览
提问于 2025-04-15 16:37

因为我喜欢小文件,所以我通常在每个Python模块里只放一个“公共”类。我会把模块命名为和它包含的类相同的名字。比如说,类ToolSet会定义在ToolSet.py这个文件里。

在一个包里,如果其他模块需要创建一个ToolSet类的对象,我会使用:

from ToolSet import ToolSet
...
toolSet = ToolSet()

而不是:

import ToolSet
...
toolSet = ToolSet.ToolSet()

这样做是为了减少“重复”(我更喜欢在文件顶部看到重复,而不是在我的代码中)。

这样做对吗?

这里有个相关的问题。在一个包里,我通常有少量的类想要对外公开。我会在那个包的__init__.py文件里导入这些类。比如说,如果ToolSetUI包里,而我想要公开它,我会在UI/__init__.py里写:

from ToolSet import ToolSet

这样,从外部模块我就可以写

import UI
...
toolSet = UI.ToolSet()

再问一次,这样做算不算符合Python的风格?

4 个回答

0

要判断这是否符合 Python 的风格,可以看看网上通常被认为是权威的答案: http://effbot.org/zone/import-confusion.htm

另外,也可以看看 ~unutbu 的链接,里面对这个问题有更详细的讨论。

0

是的,我认为这两种写法在Python中都是很常见的。

我通常会用 from module import name 这种方式来导入一些标准库里的模块,比如 datetime,主要是对那些关系紧密的模块,或者是那些在模块中经常用到的名字。例如,我一般会用这种方式导入ORM类。

而对于一些标准模块(特别是 osos.path),我更倾向于使用 import module 这种写法,尤其是当名字不太明显的时候(比如 database.sessioncherrypy.session 是两种不同的会话),还有那些不常用的名字,提到模块名会让代码更容易理解。

总的来说,有一些经验法则(比如 import os.path),但到底用哪种写法,主要还是看个人的判断、喜好和经验。

5

关于你第一个问题,我用的就是这种说法,而且这种用法得到了PEP8,Python的风格指南的支持。

不过这样说也是可以的:

from subprocess import Popen, PIPE

我喜欢这种写法,因为它减少了输入的字数,并且确保在文件运行时就能立刻发现问题(比如你拼错了一个导入),而不是等到稍后某个使用了这个导入的函数运行时才发现。

比如说,如果模块Thing里没有Thyng这个成员:

from Thing import Thyng

你一运行.py文件就会出错,而

import Thing
# ...
def fn():
    Thing.Thyng()

直到你运行fn()时才会出错。

至于你第二个问题,我觉得那也是个好习惯。当我把一个大的.py文件拆分成一个目录,并且里面有一个__init__.py和一些实现文件时,这种情况经常发生。把东西导入到__init__.py里可以保持接口的一致性。这在标准库中也是一种常见的做法。

撰写回答