type 是类的构造器而非类型检查函数,其底层调用 type('A', (), {}) 动态创建类;Python 3 中元类需用 metaclass=MyMeta 关键字指定;元类的 new 创建类对象,__init__ 修改类对象,__call__ 控制实例化过程。

type 是类的构造器,不是类型检查函数
很多人第一次见 type 时以为它只是判断变量类型的工具,其实它在 Python 中更根本的身份是「类的构造器」。当你写 class A: pass,解释器底层实际调用的是 type('A', (), {}) —— 三个参数分别对应类名、父类元组、属性字典。
这意味着你可以完全绕过 class 语句动态创建类:
A = type('A', (), {'x': 1, 'say': lambda self: 'hi'})
a = A()
print(a.x) # 1
print(a.say()) # 'hi'
注意:直接用 type 创建类时,若想继承,第二个参数必须是 tuple(哪怕只继承 object,也要写成 (object,)),写成 [object] 或 object 都会报 TypeError: metaclass conflict。
__metaclass__ 在 Python 2 和 Python 3 中行为完全不同
Python 2 支持在类定义中直接写 __metaclass__ = MyMeta 来指定元类;但 Python 3 废除了这个语法,改用关键字参数 metaclass=MyMeta,且必须放在 class 语句的括号内(即继承列表之后):
立即学习“Python免费学习笔记(深入)”;
- Python 2 写法(无效于 Python 3):
class A: __metaclass__ = MyMeta - Python 3 正确写法:
class A(metaclass=MyMeta): pass - 若同时有继承和元类:
class A(B, C, metaclass=MyMeta): pass——metaclass必须是最后一个关键字参数
混用会导致 SyntaxError: invalid syntax 或 TypeError: metaclass conflict,尤其当父类本身指定了元类而子类又没显式传 metaclass 时,Python 3 会尝试自动合并,失败就抛错。
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
元类的 __new__ 和 __init__ 执行时机与职责分离
元类的 __new__ 在类对象被创建「之前」运行,负责返回一个类对象(通常是调用 super().__new__());__init__ 在类对象创建「之后」运行,用于修改已生成的类对象。两者不可替代:
-
__new__(cls, name, bases, attrs):能改name、bases、attrs,甚至返回一个完全不同的类(比如装饰后的类或代理类) -
__init__(cls, name, bases, attrs):此时cls已是真正的类对象,不能再改__name__或继承关系,但可以增删方法、设置属性、注册类到全局表等
常见误操作:在 __init__ 里试图修改 cls.__bases__ —— 这不会生效,且无报错,容易误以为逻辑已执行。
自定义元类时,__call__ 控制的是「实例化」而非「类创建」
元类的 __call__ 方法控制的是「调用类来创建实例」的过程(即 A()),不是控制 class A: 的定义过程。它等价于类的 __new__ + __init__ 组合,但发生在元类层级:
class TracingMeta(type):
def __call__(cls, *args, **kwargs):
print(f'Creating instance of {cls.__name__}')
return super().__call__(*args, **kwargs)
class A(metaclass=TracingMeta):
pass
a = A() # 输出:Creating instance of A
如果你看到有人用元类 __call__ 去“拦截类定义”,那是理解错位了——类定义由 __new__ 和 __init__ 处理;__call__ 只管后续的 A() 调用。这点混淆是调试元类逻辑时最常卡住的地方。










