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)

 

posted @ 2020-03-31 15:05  Parallax  阅读(136)  评论(0编辑  收藏  举报