《Python编程基础》课件-6.6.6Python中的单例模式_第1页
《Python编程基础》课件-6.6.6Python中的单例模式_第2页
《Python编程基础》课件-6.6.6Python中的单例模式_第3页
《Python编程基础》课件-6.6.6Python中的单例模式_第4页
《Python编程基础》课件-6.6.6Python中的单例模式_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python中的单例模式教学目标1.掌握实现单例模式的基本方法

2.学习使用元类实现单例模式

单例模式(SingletonPattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。核心概念:单例模式确保类只有一个实例;全局访问点通过类方法或属性提供;适用于共享资源管理;Python实现依赖__new__或元类。1、什么是单例模式及其重要性

#普通类:允许多个实例classNormalClass:#定义普通类def__init__(self):#初始化方法pass#无特殊控制obj1=NormalClass()#创建第一个实例obj2=NormalClass()#创建第二个实例,不同对象print(obj1isobj2)#输出False,表示不同实例#单例概念:限制为一个实例(完整实现见后续页)classSingleton:#单例类预览_instance=None#类属性存储唯一实例def__new__(cls):#重写__new__控制创建ifcls._instanceisNone:#检查是否已存在cls._instance=super().__new__(cls)#创建唯一实例returncls._instance#返回同一实例手动实现单例模式通过重写__new__方法和使用类属性存储实例。这涉及在__new__中检查是否已存在实例,若无则创建,否则返回现有实例。核心概念:__new__方法负责对象创建,可用于控制实例数;类属性存储共享实例;手动实现提供灵活性,但需处理初始化重复。2.手动实现单例模式的基本方法#手动单例类实现classManualSingleton:#定义单例类_instance=None#类属性,初始为None,用于存储唯一实例def__new__(cls,*args,**kwargs):#重写__new__方法,控制实例创建ifcls._instanceisNone:#检查是否已存在实例cls._instance=super(ManualSingleton,cls).__new__(cls)#创建新实例returncls._instance#返回唯一实例def__init__(self,value=None):#初始化方法,可接受参数ifnothasattr(self,'initialized'):#检查是否已初始化(防止重复)self.value=value#设置属性self.initialized=True#标记已初始化核心概念:实例唯一性通过is运算符验证;单例模式突出全局共享;适用于配置或连接池。3.单例模式的简单代码示例#简单单例配置类classConfigSingleton:#单例配置管理器_instance=None#存储唯一实例def__new__(cls):#重写创建方法ifcls._instanceisNone:#未存在则创建cls._instance=super().__new__(cls)#调用超类创建cls._instance.config={}#初始化配置字典returncls._instance#返回实例#调用示例config1=ConfigSingleton()#获取实例config1.config['theme']='dark'#设置配置config2=ConfigSingleton()#再次获取,应同一print(config2.config['theme'])#输出'dark',共享配置print(id(config1)==id(config2))#输出True,确认同一对象使用元类(metaclass)实现单例,通过自定义类的创建过程控制实例化。核心概念:元类控制类行为;__call__拦截实例化;实例字典支持多类单例。4.使用元类实现单例模式#元类单例实现classSingletonMeta(type):#定义元类,继承type_instances={}#字典存储各类的唯一实例def__call__(cls,*args,**kwargs):#重写__call__,当类被调用时触发ifclsnotincls._instances:#检查类是否已有实例cls._instances[cls]=super().__call__(*args,**kwargs)#创建并存储returncls._instances[cls]#返回实例#使用元类classLogger(metaclass=SingletonMeta):#指定metaclassdef__init__(self):#初始化self.log=[]#日志列表单例模式用于数据库连接池、缓存管理器或全局配置。核心概念:实际应用聚焦资源共享;数据库/配置常见场景;结合线程锁处理并发。5.单例模式在实际场景中的应用importsqlite3#导入数据库模块classDBConnection(metaclass=SingletonMeta):#单例数据库连接def__init__(self):#初始化self.conn=sqlite3.connect('app.db')#创建连接#应用示例db1=DBConnection()#获取连接cursor1=db1.conn.cursor()#使用游标db2=DBConnection()#同一连接cursor2=db2.conn.cursor()#共享常见问题:多线程竞争创建;继承冲突。最佳实践:使用threading.Lock;限制使用单例;模块级变量替代;文档化全局影响。核心概念:线程安全需锁保护;过度使用导致耦合;最佳实践强调最小化全局状态。6.分代垃圾回收importthreading#导入线程模块classThreadSafeSingleton:#线程安全单例_instance=None#实例_lock=threading.Lock()#锁def__new__(cls):#重写创建withcls._lock:#获取锁ifcls._instanceisNone:#检查cls._instance=super().__new__(cls)#创建returncls._instance#返回Borg模式变体是Python中共享状态,而非实例的单例变体,通过__dict__共享确保一致核心概念:Borg共享状态;变体包括__dict__;模式强调多实例一致。6.Borg模式变体介绍classBorg:#类_shared={}#共享字典def__init__(self):#初始化self.__dict__=self._shared#共享b1=Borg()#实例1b1.val=5#设置b2=Borg()#实例2pr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论