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类定义的模块。 IE。必须先声明所有内容,然后才能使用它。
我认为这是没有必要的吗?这是鸭子打字,对不对?因此,如果不需要导入即可查看类的方法,那么我至少需要将其用于类定义本身和模块的顶级功能?
在我编写的一个脚本中,我什至甚至编写了一个基类来声明带有一组方法的接口(interface),然后派生出具体的类来继承该接口(interface),但是我想我现在明白了–这是错误的。 Python,是否在调用时在运行时检查对象是否具有特定方法?
我意识到Python比C++更具动态性,花了我一段时间才能看到您实际上需要编写多少代码!
我想我知道这个问题的答案,但我只是想澄清一下,确保自己走在正确的道路上。
更新:感谢您提供所有答案,我想我现在应该澄清我的问题:
mod2.show_answer()是否需要导入(任何描述)才能知道该事物具有称为answer()的方法,还是在运行时动态确定的方法?
最佳答案
import
都是关于名称的-大多是在某个模块的顶级(AKA全局级别,AKA模块级别的名称)上绑定(bind)的“裸名”,例如mod2
。完成import mod2
后,您会获得mod2
命名空间作为可用名称(在您自己的模块中为顶层,如果您将import
本身作为顶层,这是最常见的;但是函数中的本地import
将将mod2
设为该函数的局部变量,等等);因此,您可以使用mod2.foobar
来访问foobar
顶层绑定(bind)的名称mod2
。如果您不需要访问此类名称,则无需在自己的模块中使用import mod2
。
关于Python-何时需要 'import'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1027557/