Python之元类


前言

本文主要介绍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)
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值