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()需要导入(任何描述)才能知道thing具有名为answer()的方法,还是在运行时动态确定?