python中单例模式是什么,python单例模式应用场景
大蟒通过__新_ _魔法方法放入需要实现的类中,可以保证实例化之后的对象为单例,进而实现单例模式。
Python单例模式的4种实现方法:
#-*-编码=utf-8-*-
打印方法1 -
#方法1,实现__新_ _方法
#并在将一个类的实例绑定到类变量_实例上,
#如果cls ._实例为没有人说明该类还没有实例化过,实例化该类,并返回
#如果cls ._实例不为没有,直接返回cls ._实例
classSingleton(object):
def__new__(cls,*args,**kw):
ifnothasattr(cls, _instance):
orig=super(Singleton,cls)
cls ._instance=orig.__new__(cls,*args,**kw)
returncls ._实例
classMyClass(单例):
a=1
one=MyClass()
two=MyClass()
two.a=3
打印通
#3
#一和二完全相同,可以用id(),==,是检测
printid(一)
#29097904
printid(两个)
#29097904
printone==two
#真的
printoneistwo
#真的
打印方法2 -
#方法2,共享属性;所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
#同一个类的所有实例天然拥有相同的行为(方法),
#只需要保证同一个类的所有实例具有相同的状态(属性)即可
#所有实例共享属性的最简单最直接的方法就是__词典_ _属性指向(引用)同一个字典(字典)
#可参看:http://code.activestate.com/recipes/66531/
班级堡(对象):
_state={}
def__new__(cls,*args,**kw):
ob=超级(博格,cls).__new__(cls,*args,**kw)
卒于__dict__=cls ._state
returnob
classMyClass2(博格):
a=1
one=MyClass2()
two=MyClass2()
#一和二是两个不同的对象,id,==,是对比结果可看出
two.a=3
打印通
#3
printid(一)
#28873680
printid(两个)
#28873712
printone==two
#错误
printoneistwo
#错误
#但是一个和二具有相同的(同一个__词典_ _属性),见:
printid(一个。__字典_ _)
#30104000
printid(两个。__字典_ _)
#30104000
打印方法3 -
#方法3:本质上是方法一的升级(或者说高级)版
#使用__元类_ _(元类)的高级大蟒用法
classSingleton2(类型):
def__init__(cls,name,bases,dict):
超级(Singleton2,cls).__init__(名称、基数、字典)
cls ._ instance=无
def__call__(cls,*args,**kw):
ifcls ._ instanceisNone:
cls ._instance=super(Singleton2,cls).__call__(*args,**kw)
returncls ._实例
classMyClass3(对象):
__元类__=Singleton2
one=MyClass3()
two=MyClass3()
two.a=3
打印通
#3
printid(一)
#31495472
printid(两个)
#31495472
printone==two
#真的
printoneistwo
#真的
打印方法4 -
#方法4:也是方法一的升级(高级)版本,
#使用装饰器(装修工),
#这是一种更蟒蛇皮,更优雅的的方法,
#单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
defsingleton(cls,*args,**kw):
实例={}
def_singleton():
ifclsnotininstances:
实例[cls]=cls(*args,**kw)
返回实例[cls]
return _ singleton
@单身
classMyClass4(对象):
a=1
def__init__(self,x=0):
self.x=x
one=MyClass4()
two=MyClass4()
two.a=3
打印通
#3
printid(一)
#29660784
printid(两个)
#29660784
printone==two
#真的
printoneistwo
#真的
one.x=1
printone.x
#1
printtwo.x
#1推荐课程:python编程入门系列图文教程
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。