Python面向对象原理分析-元类MetaClass
metaclass元类
1.前戏
对象是类实例化的结果
class Foo(object):
pass
# 第1步:调用Foo的__new__方法创建空对象。
# 第2步:调用Foo的__init__方法对对象进行初始化。
obj = Foo()
类在默认情况下是由type创建出来的
class Foo(object):
v1 = 123
def func(self):
return 69
Foo = type("Foo",(object,),{"v1":123,"func":lambda self:69})
这两种情况创建类,是完全等价的
2. metaclass
在定义类时加入metaclass指定当前类的创造者
默认情况下,metaclass=type
# 由type创建Foo类型
class Foo(object):
pass
# 由MyType创建Foo类型
class Foo(object,metaclass=MyType):
pass
2.1 指定元类(metaclass)来创建类
class MyType(type):
def __init__(cls, *args, **kwargs):
print("第2步:初始化类成员:", args, **kwargs)
super().__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
new_cls = super().__new__(cls, *args, **kwargs)
print("第1步:创建类:", new_cls)
return new_cls
def __call__(cls, *args, **kwargs):
print("第3步:创建对象&初始化对象", cls)
# 1.调用自己那个类的 __new__ 方法去创建对象
new_object = cls.__new__(cls, *args, **kwargs)
# 2.调用你自己那个类 __init__放发去初始化
cls.__init__(new_object, *args, **kwargs)
return new_object
class Foo(metaclass=MyType):
v1 = 123
def func(self):
pass
obj = Foo()
2.2 在MyType元类中自定义类变量
class MyType(type):
def __new__(cls, name, bases, attrs):
# print(name, bases, attrs)
del attrs['v1']
attrs['dex'] = "xxxx"
xx = super().__new__(cls, name, bases, attrs)
return xx
# Foo = MyType("Foo", (object,), {"v1": 123, "func": lambda self: 999})
class Foo(object, metaclass=MyType):
v1 = 123
def func(self):
pass
print(Foo.func)
print(Foo.dex)
元类在DjangoRestframework序列化器有应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署