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/

10-10 04:08