You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:35:10