Python如何处理来自"其他地方"的对象

l7l*_*ll7 3 python memory import object

这可能是一个愚蠢的问题,但我不知道如何使用我们没有定义或导入的对象.

请考虑以下示例,使用Python的datetime模块:

from datetime import date

date1 = date(2019,1,1)
date2 = date(2019,1,5)

type(date2-date1) #<class 'datetime.timedelta'>
type(date2)       #<class 'datetime.date'>
Run Code Online (Sandbox Code Playgroud)

然后date2-date1就是timedelta上课,即使我们没有导入这个.

(我可能还会做其他示例,我们获取对象,即使我们没有定义它们.)

怎么会这样?

我是否应该考虑这些新对象只是作为内存中由其他函数返回的片段弹出,即使我们没有定义它们,也包含"本身"足够的信息,以便Python解释器可以有意义地应用type()和他们的其他功能?

Mar*_*ers 5

您错误地假设import限制加载到内存中的内容.import限制模块全局变量中绑定的名称.

整个模块仍然被加载,该模块的依赖项也是如此.仅仅因为您的命名空间没有绑定datetime.timedelta对象的引用并不意味着它不可用于datetime模块.

请参阅import声明文档:

from表单使用一个稍微复杂的过程:

  1. 找到该from子句中指定的模块,必要时加载并初始化;
  2. 对于import子句中指定的每个标识符:
    1. 检查导入的模块是否具有该名称的属性
    2. 如果没有,尝试导入具有该名称的子模块,然后再次检查导入的模块中的该属性
    3. 如果找不到该属性,ImportError则引发该属性.
    4. 否则,对该值的引用将存储在本地名称空间中,如果存在则使用as子句中的名称,否则使用属性名称

因此,加载和初始化模块是一个单独的步骤,每个模块执行一次.第二步绑定命名空间中的名称.

from datetime import date确保该datetime模块被加载,然后找到datetime.date并添加date = datetime.date您的命名空间.

如果要查看加载了哪些模块,请查看sys.modules映射.这是import语句机制检查以查看给定模块是否已加载的位置.