__new__和__init__的区别
__new__是Python面向对象语言中一个很少用的函数,更多使用的是init这个函数。例如:
class Book(object): def __init__(self, title): super(Book, self).__init__(self) self.title = title # Define a book b = 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 = title b = Book('The Django Book') print(b.title)上面执行的结果:
__new__ __init__ The Django Book