Python - 何时需要'import'?
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 个回答
可以把“import”想象成一个连接器。
通过“import mod2”,你只是告诉Python可以在文件mod2.py里找到这个函数。
在这个情况下,你说得对:show_answer()这个函数接收了一个对象,然后调用这个对象的“answer”方法。只要传给show_answer()的对象有这个方法,那个对象来自哪里都没关系。
不过,如果你想在mod2里面创建一个Universe的实例,你就得先导入mod1,因为Universe不在mod2的命名空间里,即使mod2已经被mod1导入了。
import
主要是关于名字的事情——大多数情况下是指在某个模块的顶层(也就是全局层级,或者说模块级别的名字)定义的“裸名字”。比如说,有一个模块叫 mod2
。当你执行 import mod2
的时候,你就可以使用 mod2
这个名字,它代表了 mod2
模块中的所有内容(如果你在自己的模块中执行这个 import
,那么 mod2
就是你自己的顶层名字;如果是在一个函数内部执行 import
,那么 mod2
就成了那个函数的局部变量,等等)。因此,你可以通过 mod2.foobar
来访问 mod2
中顶层定义的名字 foobar
。如果你不需要访问这些名字,那你就没有必要在自己的模块中 import mod2
。