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__是不会返回任何东西的,它仅负责初始化实例,且仅在需要初始化的时候才会调用。

发表评论

邮箱地址不会被公开。 必填项已用*标注