我想了一会儿,想不出更好的头衔,对不起。
我对Python很新,而且(就像其他许多人一样)我只是无法理解import
。
我想我理解'模块'和'包',类和属性等等。这是我需要澄清的一个具体行为。
说我有一个文件,foo.py。它有一行:
x = 1
如果,在另一个文件中,我“导入foo”,我可以引用x。而且,奇妙的是,在另一个文件中我可以导入foo,现在这两个文件可以共享x。为了简单起见,让类离开讨论,我相信这是在文件之间共享属性的pythonic方式。
这里有一个问题:可以公平地说,当我import foo
时,foo.py本身是(由于缺乏更好的比喻),由解释器秘密实例化?
我意识到如果我在模块中定义一个类,它遵循传统规则,只有在我明确这样做的情况下才会被实例化。但是,python解释器(通过import
语句)在全局命名空间中实例化我的模块实例是解释属性共享行为的唯一方法。
这是真的吗?半真的吗?还是我和失落之地的Sleestaks一起游荡?
答案 0 :(得分:4)
导入模块时:
module
对象,该对象将添加到sys.modules
,其中的键是从python路径到模块的导入路径import
的特定形式决定
import foo
时,解释程序会检查sys.modules
注册名称为foo
的内容。如果找到它,它会在foo
模块的本地名称空间中提供标签foo
。如果没有,它会向下搜索pythonpath,直到找到foo
模块,将其解析为module
对象,将该对象添加到sys.modules
,并在本地添加标签该模块对象的命名空间。
import foo as foof
执行相同的操作,只创建了本地命名空间标签foof
。 from 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
,并将文件的内容(例如类栏)添加为该对象的成员。