__new__
在__init__
之前被调用,他创建对象实例后把实例对象self
传递个 __init__
。
class A():
def __new__(self):
print('__new__')
def __init__(self):
print('__init__')
>>> A()
'__new__' # __init__ 没有被执行到
# 默认下的 __new__
class A():
def __new__(self):
print('__new__')
return super().__new__(self) # 默认情况 __new__ 交棒给 __init__
def __init__(self):
print('__init__')
A()
'__new__'
'__init__'
所以事实上类内部一些初始化的工作由__new__
完成,我们前面才说了__new__
才是真正意义上的构造函数
。
metaclass
是类在创建的过程中,内部执行流程的一道主要工序。因此通过metaclass
可以拦截到类的创建过程,所以有时我们会使用它来做一些类的动态修改
。
# 普通版类的创建
class A():
def __init__(self):
self.name = 'A'
def hello():
return "I'm a"
# Metaclass 元类版类的创建 | 两种方式相等
class Metaclass(type):
def __new__(self, class_name, class_parents, class_attr):
# 参数1 class_name 类名 | 本例 默认 A
# 参数2 class_parents 父类 | 本例 默认 (object,)
# 参数3 以字典的形式写入属性和方法
return super().__new__(self, class_name, class_parents, {'name': 'A', 'hello': lambda x: "I'm a!"})
class A(object, metaclass=Metaclass):
pass
>>> A().name
'A'
>>> A().hello()
'hello'