导入模块时,是否只是使导入模块的名称空间可从主模块访问?

问题描述

如果这是真的,那么Python中的任何对象仅仅是名称空间吗?因为在导入模块时,我们使用与对象( example: module.function() & obj.method() )相同的点约定来访问模块中的名称。我认为访问属性或对象的方法只是为您要访问的属性/方法指定名称空间。这是真的吗?

解决方法

否,您还将通过运行导入的模块中的所有顶级语句来初始化导入的模块(仅限首次导入)。

使用模块名称获得的引用可以访问导入的模块名称空间。此命名空间是通过dict实现的,访问mod.some_attribute与访问mod.__dict__['some_attribute']相同。

任何对象仅仅是名称空间吗?

不,它还有更多的东西(它拥有一个命名空间,它不是一个)。每个对象都是某个类的实例。自定义类使用内部__dict__来以与模块相同的方式实现名称空间。

模块在Python文档中被称为代码的组织单位。实际上,您可以用相同的方式来考虑类,因为它们为您提供了命名空间功能。

但是,与类/对象一样,在模块中搜索属性时也无需考虑继承树。

如果您只想为自己的命名空间受益,那么请使用dict或空的class。甚至还有一个types.SimpleNamespace类。

我认为访问属性或对象的方法仅仅是 指定您想要的属性/方法的名称空间 访问。这是真的吗?

或多或少(是的,除了“正义”一词外)。它使用对象名称(引用)来访问名称空间,并使用属性名称作为基础__dict__对象的名称空间的键,但是隐式挂钩可能会在后台运行代码。