Python学习之路(4)——init和new方法
1、什么是__init__方法?
Python面向对象编程过程中,可能对类的__init__方法已经非常熟悉了,__init__方法通常用在初始化一个类实例的时候。
class Person(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__': nicolas = Person('nicolas', 999) print(nicolas)
上述例子是__init__方法的最普通的用法。但是实际上__init__方法不是实例化一个类时第一个被调用的方法。当使用Person(name, age)来实例化一个类时,最先被调用的方法其实是__new__方法。
2、什么是__new__方法?
__init__方法是在类实例化之后调用,__new__方法则是创建这个类实例的方法。
class Person(object): def __new__(cls, name, age): print('__new__ called.') return object.__new__(cls) def __init__(self, name, age): print('__init__ called.') self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__': nicolas = Person('nicolas', 999) print(nicolas)
执行结果如下:
__new__ called. __init__ called. <Person: nicolas(999)>
通过运行这段代码,可以看出,__new__方法的调用确实是发生在__init__方法之前。
其实当实例化一个类的时候,具体的执行逻辑是这样的:
p = Person(name, age)
1.创建p这个名字
2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会返回Person类的一个实例
3.将__new__返回的类实例赋值给p
4.然后利用这个实例来调用类的__init__方法(__init__里面的的self这个参数,就是__new__方法产生的实例)
所以,__init__和__new__最主要的区别在于:
1.__init__通常用于初始化一个新实例,控制这个初始化的过程,比如添加属性, 做一些额外的操作,在类实例被创建完以后调用。它是实例级别的方法。
2.__new __常用于控制生成一个新实例的过程。它是类级别的方法。