Python中的__new__和__init__这两个方法详解
我们平时在阅读某些python项目的源代码时,经常看到__new__和__init__着两个方法,虽然大体明白什么意思,但始终没有深入的去研究这两者的分别,于是今天来研究一下:
首先来看看__new__
__new__时一个类(class)方法。class在新建实例时就会调用这个方法,它主要控制一个新实例的创建。但是我们必须要了解,__new__仅仅是创建实例的第一步,调用它后,它会负责返回该类的一个新实例。
一般情况下,__new__这个方法除非需要集成不可变类型如str、interesting、unicode、tuple等,否则不必重写。
关于__new__方法的用法,我们可以举个例子来看看:
根据Python官方文档的描述,__new__方法时当你集成一些不可变的class的时候,提供给你一个自定义这些类的实例化过程的途径。另外就是实现自定义的metaclass。
由此,我们用int来作为例子,我们需要一个恒正的整数,通过集成int,我们可能会这样写:
class PInterger(int): def __init__(self,value): return super(PInterger,self).__init__(self,abs(value)) i = PInterger(-3) print(i)
不过很遗憾,最终运行的结果根本不是我们想的那样,它仍然输出了一个-3.

因为对于int这种不可变的对象,我们只有重载它的__new__方法才能起到自定义的作用,我们将代码修改成下面这样:
class PInterger(int):
def __new__(cls, value):
return super(PInterger,cls).__new__(cls,abs(value))
i = PInterger(-3)
print(i)
这次我们重载了__new__方法,并且达到了我们想要的效果

__init__方法是什么
那么__init__方法到底是什么?它是一个实例方法。class调用__init__的时候,其实知识对这个class生成的新实例进行初始化,初始化的内容就定义在__init__这个方法里面。
每当新建一个实例的时候,都会初始化这些类容,而这些类容只会初始化给新创建的实例,跟class是无关的。
另外,__init__是不会返回任何东西的,它仅负责初始化实例,且仅在需要初始化的时候才会调用。