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__方法

浙公网安备 33010602011771号