gpt4 book ai didi

python - Python import 会实例化一个神秘类吗?

转载 作者:行者123 更新时间:2023-11-28 21:26:57 24 4
gpt4 key购买 nike

我想了一会儿,想不出更好的标题,抱歉。

我是 Python 的新手,并且(看起来像许多其他人一样)我无法理解 import

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

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

x = 1

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

问题是:公平地说,当我import foo 时,foo.py 本身(因为缺少更好的比喻)是 secret 实例化由口译员?

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

这是真的吗?半真?还是我在迷失之地与 Sleestaks 一起流浪?

最佳答案

导入模块时:

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

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

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

    关于python - Python import 会实例化一个神秘类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974848/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com