前言
本文主要介绍python的元类,以及其在drf序列化源码中的应用。
1、创建类的两种方式
1.1 传统方式
class Foo(object):
name = 'abc'
age = 20
def fun(self):
return 999
# 第1步:调用Foo的__new__方法创建空对象。
# 第2步:调用Foo的__init__方法对对象进行初始化。
obj = Foo()
print(obj.name)
print(obj.fun())
1.2 type方式
# 类名 = type("类名", (父类,) , {成员} )
Foo = type('Foo', (object, ), {'age': 123, 'func': lambda self: 888})
obj = Foo()
print(obj.age)
print(obj.func())
2、type创建类
首先执行__new__创建类,然后再执行__init__。
class type:
def __init__(self):
在空值初始化数据
def __new__(self):
创建->创建类
2.1 创建自定义类前添加或删除类中元变量或方法
- 如果类继承时出现metaclass=MyType,则代表创建类时没有使用type创建类,而是使用自定义的MyType创建类,可以通过在__new__方法中添加/删除类方法、类变量;
- 父类中指定了metaclass,则所有的子类全部由metaclass创建类。
class MyType(type):
def __new__(cls, name, bases, attrs):
# print(name, bases, attrs)
del attrs['v1'] # 删除'v1'
attrs['dex'] = "xxxx" # 添加'dex'
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
class Info(Foo): # Info类也是由MyType创建的
V2 = 456
print(Foo.func)
print(Foo.dex)
print(Foo.v1) # 程序报错
2.2 object、type说明
- object,所有类的基类(公共功能,都写在里面)
- type,创建类
class Foo(object):
name = 'abc'
age = 20
def func(self):
return 999
obj = Foo()
print(obj.__str__()) # <__main__.Foo object at 0x0000029FFFAEC340>
3.drf序列化简要流程
class SerializerMetaclass(type):
def __new__(cls, name, bases, attrs):
data_dict = {}
for k, v in list(attrs.items()): # {"v1":123,"v2":456,"v3":'哈哈哈'}
if isinstance(v, int):
data_dict[k] = attrs.pop(k)
attrs['_declared_fields'] = data_dict
return super().__new__(cls, name, bases, attrs)
class BaseSerializer(object):
pass
class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
pass
class ModelSerializer(Serializer):
pass
class UserSerializer(ModelSerializer):
v1 = 123
v2 = 456
v3 = "哈哈哈"
print(UserSerializer.v3)
print(UserSerializer._declared_fields)