2

想了很久,想不出更好的标题,抱歉。

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

我想我理解“模块”和“包”、类和属性等等。这是我需要澄清的一种具体行为。

假设我有一个文件 foo.py。它有一行:

x = 1

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

问题来了:公平地说,当i 时import foo, foo.py 本身(因为没有更好的比喻)是由解释器秘密实例化的?

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

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

4

3 回答 3

4

导入模块时:

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

import foo as foof做同样的事情,只有创建的本地命名空间标签是foof. from foo import x遵循相同的过程,直到在本地命名空间中创建标签和引用,而不是在命名空间中为模块 x中的属性提供标签。只是结合了2个想法。xfoofrom foo import x as foox

__module__使用类,您实际上可以通过使用属性在树上上下爬行来探索整个系统。

于 2012-08-15T18:28:26.027 回答
2

导入创建一个“模块”对象的实例。值得知道的是,这仅在第一次导入模块时创建。在以下导入时,您将获得对原始文件的引用。您可以通过一些自省来动态创建自己的模块对象。

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

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

尽管创建这些并没有太多好处。

于 2012-08-15T18:40:30.293 回答
0

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

于 2012-08-15T18:28:07.660 回答