python __new__和__init__的区别

来源:互联网 发布:电信会屏蔽哪些端口 编辑:程序博客网 时间:2024/06/05 16:58

__new__和__init__的区别

__new__是Python面向对象语言中一个很少用的函数,更多使用的是init这个函数。例如:

class Book(object):    def __init__(self, title):        super(Book, self).__init__(self)        self.title = title# Define a bookb = Book('The Django Book')print(b.title)

上面算是OOP语言的入门代码了,粗略一看__init__和java中的构造函数一样,其实不然,实际上它根本不能算的上构造函数。__new__才是创建实例的方法。

根据官方文档:

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

class Book(object):    def __new__(cls, title):        print '__new__'        return super(Book, cls).__new__(cls)    def __init__(self, title):        print '__init__'        super(Book, self).__init__(self)        self.title = titleb = Book('The Django Book')print(b.title)

上面执行的结果:

__new____init__The Django Book