Python类创建机制疑问:传统方式与type()动态创建的差异
关于Python类定义与动态创建类的变量绑定问题
你猜的没错!传统方式定义类时,Python确实会自动在当前作用域创建一个同名变量,指向刚定义的类对象——这就相当于你手动写了Foo = class Foo: bar = True的逻辑(当然实际语法不允许这么写,但底层逻辑是一致的)。
为什么class语句会自动绑定变量?
class本质上是Python提供的语法糖,它在底层其实也是调用type()来创建类对象的,但额外帮你做了一步:把创建好的类对象绑定到和类名同名的变量上,放到当前的作用域里。比如:
class Foo: bar = True
这段代码执行后,Python内部的流程大概是:
- 调用
type('Foo', (), {'bar': True})创建类对象 - 在当前作用域中创建变量
Foo,并将其指向这个类对象
那为什么type()动态创建时不会自动生成同名变量?
因为type()就是个普通的内置函数啊!它的职责仅仅是创建类对象并返回它,就像你调用dict()会返回一个字典对象,但不会自动帮你把这个字典绑定到某个变量上一样。你需要手动把它的返回值赋值给一个变量,才能在后续代码中通过变量名访问这个类:
# 手动赋值后就能正常访问了 Foo = type('Foo', (), {'bar': True}) print(Foo) # 输出 <class '__main__.Foo'> print(Foo.bar) # 输出 True
这里还要区分一个概念:类的__name__属性和作用域中的变量名是完全两回事。动态创建的类__name__属性是'Foo',这只是类对象自身的一个标识属性,但和当前作用域里有没有名为Foo的变量没有任何关系。比如你完全可以把它赋值给其他变量:
MyCustomClass = type('Foo', (), {'bar': True}) print(MyCustomClass.__name__) # 输出 'Foo' print(MyCustomClass.bar) # 输出 True
内容的提问来源于stack exchange,提问作者user1104854
相关产品推荐
相关产品推荐

