IPython中module相关疑问:未定义的module为何是类型且有类型?
关于Python模块类型与属性的疑问解答
一、为什么type(sys)返回module但直接引用module会报错?
module是模块对象的类型名称,但该类型并未直接暴露在全局命名空间中,它实际定义在types模块内。要直接访问这个类型,需先导入types模块:
import sys import types print(type(sys) is types.ModuleType) # 输出: True
- 执行
type(sys)时,Python打印的是该类型的__name__属性值(即"module"),而非可直接调用的变量名。因此看起来存在module类型,但这个名称并未绑定到全局作用域,直接引用自然会触发NameError。 type(type(sys))返回type是Python元类机制的体现:所有类型(包括types.ModuleType)本身都是type的实例,就像type(int)也会返回type一样。
二、模块的__builtins__等属性来自哪里?
这些属性并非通过继承获得,而是Python解释器在加载模块的过程中自动注入到模块对象中的:
- 当Python导入模块时,会先创建一个
types.ModuleType的实例,然后为该实例初始化这些属性:__name__: 模块的名称__file__: 模块对应的文件路径(仅文件模块有此属性)__builtins__: 指向内置命名空间的引用__cached__: 编译后字节码文件的存储路径__loader__/__spec__: 与模块加载流程相关的对象__doc__: 模块的文档字符串__package__: 模块所属的包名称
- 这些是模块对象的固有属性,由解释器负责初始化,并非从父类(
object)继承而来。
内容的提问来源于stack exchange,提问作者Pierre ALBARÈDE
相关产品推荐
相关产品推荐

