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

为何用type()动态创建的类无法通过类名直接访问?

为什么用type()动态创建的Bar不在当前命名空间?

当你通过type('Bar', (), {})动态生成类时,第一个参数'Bar'仅用于设置类的__name__属性,并不会自动在当前全局/局部命名空间中创建名为Bar的变量指向这个类。

对比常规类定义的区别

常规用class C:定义类时,Python解释器会自动帮你完成两步:

  1. 创建类对象;
  2. 在当前命名空间中添加一个与类名同名的变量(比如C),指向这个新创建的类对象。
    所以哪怕你给它赋值别名s = C,原变量C依然存在,自然能通过C()实例化。

type()动态创建类的逻辑

type()是一个函数,它的返回值就是新创建的类对象。你必须手动把这个返回值赋值给某个变量(比如你的例子里的xx),这个变量才会进入当前命名空间。而Bar只是这个类的“名称标识”,存储在__name__属性中,和命名空间里的变量名没有绑定关系。

验证与解决

如果想让Bar()能直接调用,只需手动把类对象赋值给命名空间中的Bar变量:

xx = type('Bar', (), {})
Bar = xx
print(Bar())  # 此时不会再报NameError

额外说明

类的__name__属性主要用于类型显示、模块导入标识等场景,和命名空间中的变量名是完全独立的两个概念,两者可以完全不同:

Test = type('Foo', (), {})
print(Test.__name__)  # 输出 'Foo'
print(type(Test()))   # 输出 <class '__main__.Foo'>

内容的提问来源于stack exchange,提问作者SriHarsha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:36:01