python编程入门单例_python基础之单例模式

单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.

单例模式的要点三个:

--某个类智能有一个实例

--他必须自行创建这个实例

--必须自行向整个系统提供这个实例

在python中,我们可以用多种方法来实现单例模式:

使用模块

使用__new__

使用装饰器(decorator)

使用元类(metaclass)

使用模块

python的模块就是天然的单例模式

ContractedBlock.gif

ExpandedBlockStart.gif

classMyclass(object):deffoo(self):print('Myclass.foo')

my_class_obj=Myclass()

fx.py

from fx importmy_class_obj

my_class_obj.foo()

使用__new__

ContractedBlock.gif

ExpandedBlockStart.gif

classMyclass(object):

_instance=Nonedef __new__(cls, *args, **kwargs):if notcls._instance:

cls._instance=super(Myclass, cls).__new__(cls,*args,**kwargs)returncls._instance#我们将类的实例和一个类变量_instance关联起来,如果cls._instance为None则创建实例,否者直接返回cls._instance

classHerclass(Myclass):

a=1one=Herclass()

two=Herclass()print(one==two)print(one istwo)print(id(one),id(two))

__new__

使用装饰器

ContractedBlock.gif

ExpandedBlockStart.gif

from functools importwrapsdefsin(cls):

instances={}

@wraps(cls)def get(*args,**kwargs):if cls not ininstances:

instances[cls]=cls(*args,**kwargs)returninstances[cls]

@sinclassMyclass(object):

a=1

#我们定义了一个装饰器sin,他返回了一个内部函数get,该函数会判断某一个类是否在字典instance中,如果不存在,就会将cls#作为key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。

装饰器

使用__metaclass__

元类可以控制类的创建过程,三件事:

---拦截类的创建

---修改类的定义

---返回修改后的类

ContractedBlock.gif

ExpandedBlockStart.gif

importthreadingclassSingleton2(type):def __init__(cls, name, bases, dict):

super(Singleton2, cls).__init__(name, bases, dict)

cls._instance=Nonedef __call__(cls, *args, **kw):if cls._instance isNone:

cls._instance= super(Singleton2, cls).__call__(*args, **kw)returncls._instance#python2

classMyClass(object):__metaclass__ =Singleton2

one=MyClass()

two=MyClass()

two.a= 3

#print one.a#3#print id(one)#31495472#print id(two)#31495472

__metaclass__

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值