在Python的面向对象体系中,类本身也是对象,而创建类的类被称为元类,很多开发者会疑惑通过元类创建的类的类型到底属于哪一类,这需要从Python的类型系统底层逻辑来梳理。

普通类的类型本质
在Python中,所有的类默认都是由type元类创建的,我们可以通过type()函数来验证普通类的类型。比如定义一个简单的普通类:
# 定义一个普通类
class NormalClass:
def __init__(self, name):
self.name = name
# 查看NormalClass的类型
print(type(NormalClass))
运行上述代码会输出<class 'type'>,这说明普通类的类型是type,也就是说type是Python默认的元类,负责创建所有的普通类。
自定义元类创建类的过程
除了使用默认的type元类,我们还可以自定义元类,自定义元类需要继承type类,然后重写相关的方法。下面是一个自定义元类的示例:
# 自定义元类,继承type
class MyMeta(type):
def __new__(cls, name, bases, attrs):
# 可以在创建类的时候添加自定义属性
attrs['custom_attr'] = '来自自定义元类的属性'
return super().__new__(cls, name, bases, attrs)
# 使用自定义元类创建类
class MyClass(metaclass=MyMeta):
pass
# 查看MyClass的类型
print(type(MyClass))
# 查看MyClass的元类
print(type(MyClass).__name__)
# 查看MyClass的自定义属性
print(MyClass.custom_attr)
运行上述代码,首先会输出<class 'MyMeta'>,这说明MyClass的类型是我们自定义的MyMeta元类;接着输出MyMeta,确认了MyClass的元类归属;最后输出来自自定义元类的属性,说明自定义元类确实参与了类的创建过程。
元类创建的类的类型规律
通过上面的示例可以总结出规律:类的类型就是创建它的元类。如果类是由默认的type元类创建的,那么它的类型就是type;如果类是由自定义元类MyMeta创建的,那么它的类型就是MyMeta。
我们可以进一步验证元类本身的类型,因为元类本身也是类,所以它也应该有对应的类型:
# 查看自定义元类MyMeta的类型 print(type(MyMeta)) # 查看默认元类type的类型 print(type(type))
运行后会发现,MyMeta的类型是type,type的类型也是type,这说明所有的元类最终都是由type创建的,type是Python类型体系中最顶层的元类。
类的类型判断场景
在实际开发中,我们可能需要判断一个类是否由特定的元类创建,这时候可以使用isinstance函数或者对比type()的结果:
# 判断MyClass是否由MyMeta创建 print(isinstance(MyClass, MyMeta)) # 输出True # 判断NormalClass是否由MyMeta创建 print(isinstance(NormalClass, MyMeta)) # 输出False # 对比类型结果 print(type(MyClass) is MyMeta) # 输出True print(type(NormalClass) is type) # 输出True
这种判断方式在框架开发中非常常见,比如很多Web框架会通过元类来创建视图类,然后通过类型判断来区分不同的类处理逻辑。
总结
元类创建的类的类型就是该元类本身,这是Python面向对象类型体系的核心规则。默认情况下所有普通类由type创建,所以普通类的类型是type;自定义元类继承type,由它创建的类的类型就是该自定义元类。理解这个规则可以帮助我们更好地掌握Python的元类机制,在需要动态创建类或者框架开发的场景中灵活运用。
元类类类型typePython面向对象metaclass修改时间:2026-07-13 16:36:32