__init__
与__new__
的区别
__init__
与__new__
的主要区别如下:
__new__
是一个静态方法,而__init__
是一个实例方法.__new__
方法会返回一个创建的实例,而__init__
什么都不返回.- 只有在
__new__
返回一个cls的实例时后面的__init__
才能被调用. - 当创建一个新实例时调用
__new__
,初始化一个实例时用__init__
__new__
的使用
我们先看一下普通例子:
|
|
这是__init__
最普通的用法了。但__init__
其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__
方法,等价于以下过程:
|
|
1.person = Person(name, age)
2.首先执行使用name和age参数来执行Person类的__new__
方法,这个__new__
方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__
(cls, … …) 这样的方式),
3.然后利用这个类实例来调用类的__init__
方法,上一步里面__new__
产生的实例也就是 __init__
里面的 self。
所以,__init__
和 __new__
最主要的区别在于:
1.__init__
通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__
通常用于控制生成一个新实例的过程。它是类级别的方法。
因此一个应用就是__new__
方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。
|
|
|
|
还有一个应用便是__new__
来实现单例
|
|