首页 新闻 会员 周边 捐助

考虑以下Python代码的输出结果:

0
[已关闭问题] 关闭于 2025-11-28 16:22
考虑以下Python代码的输出结果:
class Meta(type):
    def __new__(cls, name, bases, dct):
        dct['version'] = 1.0
        return super().__new__(cls, name, bases, dct)
class Base(metaclass=Meta):
    pass
class Child(Base):
    pass
print(Child.version)
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1152
提问于:2025-11-28 16:10
< >
分享
所有回答(1)
0

1. 元类(metaclass)是什么?

  • 在 Python 中,类也是对象。
  • 类是由 元类 创建的,默认元类是 type
  • 当你写 class MyClass: ...,Python 实际上会调用 type('MyClass', (), {...}) 来创建这个类。
  • 如果你指定了 metaclass=Meta,那么 Python 就会用 Meta 而不是 type 来创建这个类。

Meta.__new__ 做了什么?

def __new__(cls, name, bases, dct):
    dct['version'] = 1.0
    return super().__new__(cls, name, bases, dct)

 

  • name: 要创建的类名(比如 'Base'
  • bases: 父类元组(比如 (object,) 或 (Base,)
  • dct: 类的属性字典(就是你在 class 里定义的方法、变量等)

👉 这里它往 dct 里加了一个属性:version = 1.0
也就是说:所有用 Meta 作为元类的类,都会自动拥有 version = 1.0

Base 使用了元类 Meta

Python
编辑
 
 
1class Base(metaclass=Meta): 2 pass
  • 所以当 Python 创建 Base 这个类时,会调用 Meta.__new__
  • 结果:Base.version == 1.0

Child 继承自 Base

Python
编辑
 
 
1class Child(Base): 2 pass
  • 注意:Child 没有显式指定 metaclass
  • 但在 Python 中,子类会继承父类的元类(如果没冲突的话)
  • 所以 Child 的创建也会使用 Meta

Child 的创建也会触发 Meta.__new__

  • Base 的元类是 Meta
  • Child 继承 Base
  • Python 会自动使用 Base 的元类(即 Meta)来创建 Child
  • 所以 Meta.__new__ 会被调用 两次:
    • 第一次:创建 Base
    • 第二次:创建 Child

因此,在创建 Child 时,Meta.__new__ 又执行了一次,又往 Childdct 里加了 version = 1.0

所以 Child.version 不仅能通过继承得到,它自己也有这个属性!

*Tesla* | 园豆:1152 (小虾三级) | 2025-11-28 16:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册