今天想跟大家谈谈有关Python中的__new__和__init__的问题,其实这个问题对于我来说还是比较难的,想要彻底弄明白这两个的区别的确不是一件容易的事情。下面就是我自己的一些简单的看法。
首先我们要明白一点的是,只有继承于object的类,或者更准确的说,祖先类是object类才有__new__方法,其他的类没有这个方法。还有一点需要注意是__new__先于__init__被调用,而__new__必须要有返回值,返回的就是__init__的第一个参数self。
好了,下面我们来看看__new__和__init__到底是个什么东西。
我们还是通过一个例子来看看吧。
class Person(object): """Wilson Person""" def __new__(cls, name, age): print ('__new__ is called.') return super(Person, cls).__new__(cls, name, age) def __init__(self, name, age): print ('__init__ is called.') self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__':
print(Wilson) 执行结果如下:Wilson = Person('Wilson', 24)
从上面的例子我们可以看到,__new__方法先于__init__方法被调用,我们下面来看看当实例化一个对象的时候,具体的逻辑顺序是怎么样的。__new__ is called. __init__ is called. <Person: Wilson(24)>
当我们实例化一个对象的时候,它的逻辑顺序是这样的:Wilson = Person('Wilson', 24)
- 首先程序会把name和age这两个参数传递给__new__方法,这个方法会返回一个Person类的实例。上面代码重写了__new__方法,这也是该方式通常运行的方式
- 然后这个实例会通过__init__的第一个参数self传入__init__的方法中,然后把参数真正的初始化
所以我们简单的总结一下,
- __init__方法主要是用来初始化一些实例的参数,比如添加一些属性,或者做一些其他的事情,这个初始化过程发生在实例被创建以后。
- __new__方法通常用来控制的实例产生的过程,它可以对这个类做一些配置或者处理。
__init__方法大家应该都比较熟悉了,下面通过一个经典的例子来看看__new__的作用,它就是利用__new__如何实现单例模式我们还是先看代码# -*- coding: utf-8 -*- class Singleton(object): """docstring for Singleton""" # 利用__new__来实现单例模式 def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance # 进行测试,是否实现单例模式 Singleon1 = Singleton() Singleon2 = Singleton() Singleon1.value1 = "Wilson" print(Singleon1 is Singleon2) print(Singleon2.value1)
通过上面的例子,大家可以看到用__new__实现单例模式的方法,Singleon1和Singleton2都拥有value1属性,他们俩个是同一个实例。以上就是今天的全部内容与您共勉