单例模式算是最常见的设计模式了,也是面试中的高频测试点。这一篇就来总结下如何在python中实现单例模式。
单例模式
所谓单例模式,就是针对某一个类,不管实例化多少次,实例出来的对象都是同一个。
之所以需要用到单例模式,有两个主要原因。其一是在程序开发中很多对象用于全局的记录,这些对象不管在程序的哪个地方被调用都应该是指向同一个,例如日志对象。其二是因为对象的创建和销毁都是耗费资源的,如果对象的创建次数减少,势必能提高程序的整体运行效率。
对象创建过程
下面先来看看python类对象的创建过程是啥样的。
平时新建一个类通常会带一个__init__()
方法,如下
class MyClass:
def __init__(self):
pass
这里的__init__()
方法的作用是对实例话的对象进行初始化,例如设定一些类变量的初始值。
但是其实在初始化之前还需要先把实例给创建出来啊,没错,这一步编译器已经替我们完成了,如果我们要手动去实现实例对象的创建可以用__new__()
方法,如下
class MyClass:
def __init__(self):
print('initialize the object')
def __new__(cls, *args, **kwargs):
print('create a new object')
return super().__new__(cls)
在所有类的基类object
类中,__new__()
方法接受一个类名做为参数,然后返回该类的一个空的实例对象。所以如果我们要自己去实现__new__()
方法,必须用super()
关键字去调用基类中的__new__()
方法,并把自带的cls
参数传递进去,从而获得一个本类的实例对象。
这样当类实例化的时候,首先将类通过cls
参数传递到__new__()
方法中,返回一个对象然后通过self参数传递到__init__()
方法中。来测试下
if __name__ == '__main__':
o = MyClass()
打印结果为
create a new object
initialize the object
值得注意的是__new__()
方法只要返回一个对象即可,不一定是本类的一个实例对象,例如
class MyClass:
def __init__(self):
print('initialize the object')
def __new__(cls, *args, **kwargs):
print('create a new object')
# return super().__new__(cls)
return TempClass()
class TempClass:
def __str__(self):
return 'This is a temp class'
这里在__new__()
方法里面返回的是一个TempClass
的对象,再来测试下
if __name__ ==