使用type()创建ABCMeta子类时__module__异常问题及解决方法问询
为什么用
type()创建ABCMeta子类时__module__是'abc'?怎么修复? 这是个挺容易踩坑的细节,我来给你拆解背后的原因和解决办法:
一、问题原因
当你用class关键字定义子类时,Python解释器会自动把当前模块名(比如交互式环境里的__main__)作为__module__属性注入到类的命名空间中,这是Python的默认行为,确保类的模块信息和定义它的上下文一致。
但当你用type()直接创建继承自ABCMeta元类的类时,如果没有显式指定__module__,ABCMeta的元类逻辑会介入:它会把类的__module__属性设置为元类自身所在的'abc'模块。这是ABCMeta内部实现的特殊处理,和普通元类/type创建类的逻辑不同。
对比代码更直观:
from abc import ABCMeta # 用type()创建子类,未指定__module__ class test(metaclass=ABCMeta): pass newclass = type('newclass', (test,), {}) print(newclass.__module__) # 输出: 'abc' # 用class关键字创建子类,自动注入__module__ class subtest(test): pass print(subtest.__module__) # 输出: '__main__'
二、解决方法:显式指定__module__
在用type()创建子类时,只需要在第三个参数的类属性字典里,显式添加__module__=__name__(__name__会自动获取当前模块名),就能让__module__属性保持正确:
from abc import ABCMeta class test(metaclass=ABCMeta): pass # 显式指定__module__为当前模块 newclass = type('newclass', (test,), {'__module__': __name__}) print(newclass.__module__) # 输出: '__main__'
这样创建出来的子类,__module__属性就和用class关键字定义的保持一致了。
内容的提问来源于stack exchange,提问作者Daniel Liu
相关产品推荐
相关产品推荐

