为何用type()动态创建的类无法通过类名直接访问?
为什么用
type()动态创建的Bar不在当前命名空间? 当你通过type('Bar', (), {})动态生成类时,第一个参数'Bar'仅用于设置类的__name__属性,并不会自动在当前全局/局部命名空间中创建名为Bar的变量指向这个类。
对比常规类定义的区别
常规用class C:定义类时,Python解释器会自动帮你完成两步:
- 创建类对象;
- 在当前命名空间中添加一个与类名同名的变量(比如
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
相关产品推荐
相关产品推荐

