09 DRF-元类(补充知识点)

1 如何基于自定义MyType创建类

方式1:

class MyType(type):
    def __new__(cls, *args, **kwargs):
        xx = super().__new__(cls, *args, **kwargs)
        return xx

Foo = MyType("Foo", (object, ), {"v1": 123, "func": lambda self: 999})

方式2:

class MyType(type):
    def __new__(cls, *args, **kwargs):
        xx = super().__new__(cls, *args, **kwargs)
        return xx
    

class Foo(object, metaclass=MyType):
    v1 = 123
    
    def func(self):
        pass

在创建类之前,在成员中做些操作:

class MyType(type):
    def __new__(cls, name, bases, attrs):
        print(cls, name, bases, attrs)
        # name = 类名
        # bases = 继承了谁
        # attrs = 成员 比如:{'v1': 123}
        # <class '__main__.MyType'> Foo (<class 'object'>,) {'__module__': '__main__', '__qualname__': 'Foo', 'v1': 123, 'func': <function Foo.func at 0x00000000026C6AF0>}

        del attrs['v1']
        attrs['dex'] = 'lxx'
        xx = super().__new__(cls, name, bases, attrs)
        return xx


class Foo(object, metaclass=MyType):
    v1 = 123

    def func(self):
        pass

print(Foo.dex)  # lxx

2 自定义MyType类的继承

class MyType(type):
    def __new__(cls, name, bases, attrs):
        print(cls, name, bases, attrs)
        xx = super().__new__(cls, name, bases, attrs)
        return xx


class Info(object):
    # 不是由MyType创建
    pass


class Base(Info, metaclass=MyType):
    # 当指定metaclass后,当前类和它所有的子类都有MyType创建
    pass


class Foo(Base):
    # Foo还是MyType创建
	# 类中或父类中,指定了metaclass,全部都是有MyType创建
    v1 = 123

object,所有类的基类(公共功能,都写在这里面)
type,创建类,type也是类

class MyType(type):
    def __new__(cls, name, bases, attrs):
        print(cls, name, bases, attrs)
        xx = super().__new__(cls, name, bases, attrs)
        return xx


class Base(object, metaclass=MyType):
    def __init__(self):
        print('初始化')

    def __new__(cls, *args, **kwargs):
        print('实例化对象')
        return object.__new__(cls)


obj = Base()

"""
<class '__main__.MyType'> Base (<class 'object'>,) {'__module__': '__main__', '__qualname__': 'Base', '__init__': <function Base.__init__ at 0x00000000026C6AF0>, '__new__': <function Base.__new__ at 0x00000000026C64C0>}
实例化对象
初始化
"""

3 扩展

class MyType(type):
    def __new__(cls, name, bases, attrs):
        print(cls, name, bases, attrs)
        xx = super().__new__(cls, name, bases, attrs)
        return xx
    
    def __call__(cls, *args, **kwargs):
        print('执行type的call')
        obj = cls.__new__(cls, *args, **kwargs)
        print('-----------')
        cls.__init__(obj, *args, **kwargs)
        return obj


class Base(object, metaclass=MyType):
    def __init__(self):
        print('初始化')

    def __new__(cls, *args, **kwargs):
        print('实例化对象')
        return object.__new__(cls)

    def __call__(self, *args, **kwargs):
        print('Base.call')

obj = Base()
# Base类是有MyType类创建出来,其实也是MyType类的实例化对象,会执行MyType类中的__call__方法
obj()
# obj()是Base类的实例化对象,会执行Base类中的__call__方法
posted @ 2022-10-19 16:46  角角边  Views(20)  Comments(0)    收藏  举报