Python 之 __new__() 方法与实例化
https://www.cnblogs.com/ifantastic/p/3175735.html
在继承基类实例化时,首先调用的__new__方法根据其第一个参数(即将生成的类)确定用哪个基类的__init__方法去初始化。
__new__方法是实例化的准备工作,在__init__之前运行。__init__是真正的实例化
1 class Foo(object): 2 def __init__(self, *args, **kwargs): 3 ... 4 def __new__(cls, *args, **kwargs): 5 return object.__new__(cls, *args, **kwargs) 6 7 # 以上return等同于 8 # return object.__new__(Foo, *args, **kwargs) 9 # return Stranger.__new__(cls, *args, **kwargs) 10 # return Child.__new__(cls, *args, **kwargs) 11 12 class Child(Foo): 13 def __new__(cls, *args, **kwargs): 14 return object.__new__(cls, *args, **kwargs) 15 # 如果Child中没有定义__new__()方法,那么会自动调用其父类的__new__()方法来制造实例,即 Foo.__new__(cls, *args, **kwargs)。 16 # 在任何新式类的__new__()方法,不能调用自身的__new__()来制造实例,因为这会造成死循环。因此必须避免类似以下的写法: 17 # 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。 18 # 使用object或者没有血缘关系的新式类的__new__()是安全的,但是如果是在有继承关系的两个类之间,应避免互调造成死循环,例如:(Foo)return Child.__new__(cls), (Child)return Foo.__new__(cls)。 19 class Stranger(object): 20 ... 21 # 在制造Stranger实例时,会自动调用 object.__new__(cls)