Python导入是否实例化了一个神秘类?

时间:2012-08-15 18:21:02

标签: python

我想了一会儿,想不出更好的头衔,对不起。

我对Python很新,而且(就像其他许多人一样)我只是无法理解import

我想我理解'模块'和'包',类和属性等等。这是我需要澄清的一个具体行为。

说我有一个文件,foo.py。它有一行:

x = 1

如果,在另一个文件中,我“导入foo”,我可以引用x。而且,奇妙的是,在另一个文件中我可以导入foo,现在这两个文件可以共享x。为了简单起见,让类离开讨论,我相信这是在文件之间共享属性的pythonic方式。

这里有一个问题:可以公平地说,当我import foo时,foo.py本身是(由于缺乏更好的比喻),由解释器秘密实例化

我意识到如果我在模块中定义一个类,它遵循传统规则,只有在我明确这样做的情况下才会被实例化。但是,python解释器(通过import语句)在全局命名空间中实例化我的模块实例是解释属性共享行为的唯一方法。

这是真的吗?半真的吗?还是我和失落之地的Sleestaks一起游荡?

3 个答案:

答案 0 :(得分:4)

导入模块时:

  1. 如果先前未导入模块,则将文件解析为module对象,该对象将添加到sys.modules,其中的键是从python路径到模块的导入路径
  2. 模块对象(或其某些成员)在导入名称空间中有别名,被引用的别名和对象由您使用的import的特定形式决定
因此,当您import foo时,解释程序会检查sys.modules注册名称为foo的内容。如果找到它,它会在foo模块的本地名称空间中提供标签foo。如果没有,它会向下搜索pythonpath,直到找到foo模块,将其解析为module对象,将该对象添加到sys.modules,并在本地添加标签该模块对象的命名空间。

import foo as foof执行相同的操作,只创建了本地命名空间标签fooffrom foo import x遵循相同的过程,直到在本地名称空间中创建标签和引用,而是在x的属性x的名称空间中提供标签foo。模块。 from foo import x as foox只是结合了两个想法。

使用类,您可以使用__module__属性在树上爬行来实际查看整个系统。

答案 1 :(得分:2)

导入会创建“模块”对象的实例。值得一提的是,只有在第一次导入模块时才会创建它。导入以下时间您将获得对原始文件的引用。您可以通过一些自省来动态创建自己的模块对象。

import glob  # Import any python module
moduleType = type(glob)

onTheFly = moduleType("OnTheFly", "Docstring for this module")

尽管创建这些产品并没有多大好处。

答案 2 :(得分:0)

是的,的确如此。如果执行import foo,则实例化模块对象foo,并将文件的内容(例如类栏)添加为该对象的成员。