Python - 何时需要'import'?

5 投票
7 回答
2275 浏览
提问于 2025-04-15 12:25

mod1.py

import mod2

class Universe:
    def __init__(self):
        pass
    def answer(self):
        return 42

u = Universe()
mod2.show_answer(u)

mod2.py

#import mod1 -- not necessary
def show_answer(thing):
    print thing.answer()

我之前是学C++的,感觉在使用show_answer这个函数之前,得先导入包含Universe类定义的模块。也就是说,所有东西都得先声明好才能用。

我这样想对吗?这不是不需要吗?这就是鸭子类型吧?所以如果不需要导入就能看到一个类的方法,那我至少需要导入类的定义和模块的顶层函数,对吧?

在我写的一个脚本里,我甚至写了一个基类来声明一个接口,里面有一组方法,然后再派生出具体的类来继承这个接口,但我现在明白了——在Python里这样做是不对的,判断一个对象是否有某个方法是在运行时,也就是在调用的时候检查的,对吗?

我意识到Python比C++要灵活得多,花了我一段时间才明白其实你需要写的代码少得多!

我觉得我知道这个问题的答案,但我只是想确认一下,确保我理解正确。

更新:感谢大家的回答,我想现在我应该澄清一下我的问题:

mod2.show_answer()需要导入(不管是什么类型的导入)才能知道这个东西有一个叫answer()的方法吗,还是说这个是在运行时动态决定的?

7 个回答

1

可以把“import”想象成一个连接器。
通过“import mod2”,你只是告诉Python可以在文件mod2.py里找到这个函数。

7

在这个情况下,你说得对:show_answer()这个函数接收了一个对象,然后调用这个对象的“answer”方法。只要传给show_answer()的对象有这个方法,那个对象来自哪里都没关系。

不过,如果你想在mod2里面创建一个Universe的实例,你就得先导入mod1,因为Universe不在mod2的命名空间里,即使mod2已经被mod1导入了。

4

import 主要是关于名字的事情——大多数情况下是指在某个模块的顶层(也就是全局层级,或者说模块级别的名字)定义的“裸名字”。比如说,有一个模块叫 mod2。当你执行 import mod2 的时候,你就可以使用 mod2 这个名字,它代表了 mod2 模块中的所有内容(如果你在自己的模块中执行这个 import,那么 mod2 就是你自己的顶层名字;如果是在一个函数内部执行 import,那么 mod2 就成了那个函数的局部变量,等等)。因此,你可以通过 mod2.foobar 来访问 mod2 中顶层定义的名字 foobar。如果你不需要访问这些名字,那你就没有必要在自己的模块中 import mod2

撰写回答