怎样建设论坛网站,外贸建站优化,报社网站建设之思考,wordpress播放歌►单例模式 ►使用场景
在编写软件时#xff0c;对于某些类来说#xff0c;只有一个实例很重要。例如#xff0c;一个系统中可以存在多个打印任务#xff0c;但是只能有一个正在工作的任务#xff1b;一个系统中可以多次查询数据库#xff0c;但是只需要一个连接#x…►单例模式 ►使用场景
在编写软件时对于某些类来说只有一个实例很重要。例如一个系统中可以存在多个打印任务但是只能有一个正在工作的任务一个系统中可以多次查询数据库但是只需要一个连接而不是每次查询都重新创建一个连接因为重复创建数据库连接会浪费内存资源。因此这种情况下确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并方便访问呢定义一个全局变量可以确保对象随时可以访问但不能防止实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建并且它可以提供一个访问该实例的方法。这就是单例模式的使用场景。
如果你想学习接口自动化测试我这边给你推荐一套视频这个视频可以说是B站播放全网第一的接口自动化测试教程同时在线人数到达1000人并且还有笔记可以领取及各路大神技术交流798478386
【已更新】B站讲的最详细的Python接口自动化测试实战教程全集实战最新版_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集实战最新版共计200条视频包括1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等UP主更多精彩视频请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from333.337.search-card.all.click
►python实现
python中实现单例模式的方法很多常用方法如下
重写__new__
类实例化时是调用__new__方法创建对象的所以只要控制__new__方法创建对象是只生成一个实例即可。
class DB:instance Nonedef __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.instancereturn wrappersingle_obj
class DB:instance Nonedb1 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.instanceclass DB(metaclassSingleObj):passdb1 DB()
db2 DB()print(db1)
print(db2)
代码运行结果如下
__main__.DB object at 0x00000252D5AE4F70
__main__.DB object at 0x00000252D5AE4F70