__new__是Python面向对象语言中一个很少用的函数,更多使用的是init这个函数。
根据官方文档:
-
__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
用__new__来实现单例
事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。
因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Singleton(object): def __new__(cls): # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象 if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance
obj1 = Singleton() obj2 = Singleton()
obj1.attr1 = 'value1' print obj1.attr1, obj2.attr1 print obj1 is obj2 |
输出结果:
1 2 | value1 value1 True |