【发布时间】:2010-11-04 21:09:09
【问题描述】:
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。一切都必须先声明后才能使用。
我认为这没有必要是对的吗?这是鸭子打字,对吧?因此,如果不需要导入来查看类的方法,我至少需要它来用于类定义本身和模块的顶级函数?
在我编写的一个脚本中,我什至编写了一个基类来声明一个带有一组方法的接口,然后派生出具体的类来继承该接口,但我想我现在明白了——那就是在 Python 中是错误的,并且在运行时在调用时检查对象是否具有特定方法?
我意识到 Python 所以比 C++ 动态得多,我花了一段时间才知道您实际上需要编写多少代码!
我想我知道这个问题的答案,但我只是想澄清一下并确保我走在正确的轨道上。
更新:感谢所有答案,我想我现在应该澄清我的问题:
mod2.show_answer() 是否需要导入(任何描述)才能知道该事物有一个名为 answer() 的方法,还是在运行时动态确定?
【问题讨论】:
-
回答你第二个问题:不,它是动态的。它会在 thing.__dict__ 中查找“答案”条目。在docs.python.org/reference/… 中查找“类实例”