Python元类示例中return type.__new__(...)的含义及返回原因是什么
这行代码的具体含义
type.__new__(metacls, name, bases, namespace) 是调用元类的父类type原生的类创建逻辑,用来生成最终的类对象,传入的四个参数分别对应:
metacls:当前自定义元类本身,也就是示例中的MakeCalc,用来告诉type生成的类要归属到这个自定义元类下name:待创建的类的类名bases:待创建的类的父类组成的元组namespace:你已经修改完成的类的命名空间字典,你新增的desc类属性、add方法都存在这个字典里,会被整合到最终生成的类中
需要返回这行结果的原因
- 元类的
__new__方法的核心作用就是返回创建完成的类对象,如果不返回这个调用结果,后续用这个元类生成类时,会拿到None,根本无法正常使用类。 - 你前面修改命名空间的操作只是类创建前的自定义预处理逻辑,Python类创建的底层逻辑(比如绑定父类、属性的底层存储、元类关联关系设置等)都封装在
type.__new__里,你没办法自己实现这些底层逻辑,必须调用父类的原生方法完成最终的类创建。
你可以用下面的测试代码验证效果:
# 用MakeCalc元类创建Calc类 class Calc(metaclass=MakeCalc): pass # 不需要在Calc里手动写任何代码,就自动拥有了元类注入的属性和方法 print(Calc.desc) # 输出 calculation print(Calc().add(1,2)) # 输出 3
如果MakeCalc的__new__方法没有返回type.__new__的调用结果,上面的Calc就会是None,后续调用全部报错。
内容的提问来源于stack exchange,提问作者J-Hoplin
相关产品推荐
相关产品推荐

