inint与 new 方法
__init__
与 __new__
方法
__new__
和__init__
参数的不同
__new__
所接收的第一个参数是cls
,而__init__
所接收的第一个参数是self
。这是因为当我们调用__new__
的时候,该类的实例还并不存在(也就是self
所引用的对象还不存在),所以需要接收一个类作为参数,从而产生一个实例。而当我们调用__init__
的时候,实例已经存在,因此__init__
接受self
作为第一个参数并对该实例进行必要的初始化操作。这也意味着__init__
是在__new__
之后被调用的。
1 |
|
结果如下:
1 |
|
创建类实例并初始化的过程中__new__
和__init__
被调用的顺序也能从上面代码的输出结果中看出:__new__
函数首先被调用,构造了一个newStyleClass
的实例,接着__init__
函数在__new__
函数返回一个实例的时候被调用,并且这个实例作为self
参数被传入了__init__
函数。****
这里需要注意的是,如果__new__
函数返回一个已经存在的实例(不论是哪个类的),__init__
不会被调用。如下面代码所示:
1 |
|
结果如下:
1 |
|
同时另一个需要注意的点是:
如果我们在__new__
函数中不返回任何对象,则__init__
函数也不会被调用。
1 |
|
结果如下:
1 |
|
可见如果__new__
函数不返回对象的话,不会有任何对象被创建,__init__
函数也不会被调用来初始化对象,__new__
返回 None
总结
__init__
不能有返回值__new__
函数直接上可以返回别的类的实例。如上面例子中的returnExistedObj
类的__new__
函数返回了一个int
值。- 只有在
__new__
返回一个新创建属于该类的实例时当前类的__init__
才会被调用.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!