►单例模式
►使用场景
在编写软件时,对于某些类来说,只有一个实例很重要。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统中可以多次查询数据库,但是只需要一个连接,而不是每次查询都重新创建一个连接,因为重复创建数据库连接会浪费内存资源。因此这种情况下确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并方便访问呢?定义一个全局变量可以确保对象随时可以访问,但不能防止实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的使用场景。
►python实现
python中实现单例模式的方法很多,常用方法如下:
重写__new__
类实例化时是调用__new__方法创建对象的,所以只要控制__new__方法创建对象是只生成一个实例即可。
-
class DB:
-
instance = None
-
def __new__(cls, *args, **kwargs):
-
if cls.instance is None:
-
cls.instance = super().__new__(cls, *args, **kwargs)
-
return cls.instance
-
db1 = DB()
-
db2 = DB()
-
print(db1)
-
print(db2)
运行代码结果如下:
-
<__main__.DB object at 0x000001BD06E55F70>
-
<__main__.DB object at 0x000001BD06E55F70>
►装饰器
将类的唯一实例保存在类属性上,然后通过类装饰器,在实例化时检查这个属性来控制只生成一个实例。
-
def single_obj(cls):
-
def wrapper(*args, **kwargs):
-
if cls.instance is None:
-
cls.instance = cls(*args, **kwargs)
-
return cls.instance
-
return wrapper
-
@single_obj
-
class DB:
-
instance = None
-
db1 = DB()
-
db2 = DB()
-
print(db1)
-
print(db2)
运行代码结果如下:
-
<__main__.DB object at 0x000001E485395970>
-
<__main__.DB object at 0x000001E485395970>
►元类
python中元类是用于创建类对象的类,类对象创建实例对象时一定会调用__call__方法,因此重写元类的__call__方法,保证在调用__call__时只创建一个实例即可。
-
class SingleObj(type):
-
def __call__(cls, *args, **kwargs):
-
if getattr(cls, 'instance', None) is None:
-
cls.instance = super().__call__(*args, **kwargs)
-
return cls.instance
-
class DB(metaclass=SingleObj):
-
pass
-
db1 = DB()
-
db2 = DB()
-
print(db1)
-
print(db2)
代码运行结果如下:
-
<__main__.DB object at 0x00000252D5AE4F70>
-
<__main__.DB object at 0x00000252D5AE4F70>
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。