Python - 什么时候需要'导入'?

Ste*_*lly 5 python import module

mod1.py

import mod2

class Universe:
    def __init__(self):
        pass
    def answer(self):
        return 42

u = Universe()
mod2.show_answer(u)
Run Code Online (Sandbox Code Playgroud)

mod2.py

#import mod1 -- not necessary
def show_answer(thing):
    print thing.answer()
Run Code Online (Sandbox Code Playgroud)

来自C++背景我觉得有必要在show_answer函数工作之前导入包含Universe类定义的模块.即在使用它之前必须声明一切.

我认为这不是必要的吗?这是鸭子打字,对吗?因此,如果不需要导入来查看类的方法,我至少需要它来用于类定义本身和模块的顶级函数吗?

在我编写的一个脚本中,我甚至编写了一个基类来声明一个带有一组方法的接口,然后派生具体的类继承该接口,但我想我现在得到它 - 这是错的Python,以及对象是否具有特定方法在运行时在进行调用时进行检查?

我知道Python是如此更加充满活力比C++,这是我花了一段时间,看看你真正需要多么少的代码来写!

我想我知道这个问题的答案,但我只想澄清并确保我走在正确的轨道上.

更新:感谢所有答案,我想我现在应该澄清我的问题:

mod2.show_answer()是否需要导入(任何描述)才能知道该东西有一个名为answer()的方法,或者是在运行时动态确定的?

bal*_*pha 6

在这种情况下你是对的:给show_answer()一个对象,它调用方法"answer".只要给show_answer()的对象有这样的方法,对象来自何处并不重要.

但是,如果你想在mod2中创建一个Universe实例,你必须导入mod1,因为Universe不在mod2命名空间中,即使mod2已经被mod1导入了.


Ale*_*lli 4

import都是关于名称的——主要是绑定在某个模块的顶层(又称为全局级别、又称为模块级别名称)的“裸名称”,例如mod2。完成后import mod2,您将获得mod2名称空间作为可用名称(如果您将其import本身作为顶级,这是最常见的,则在您自己的模块中为顶级;但是函数import中的局部变量将创建mod2局部变量该功能等);因此您可以使用mod2.foobar访问foobarmod2. 如果您不需要访问这些名称,那么您就不需要import mod2在自己的模块中访问这些名称。