python之单例模式


#单例模式:有时须要写出高性能的类,那么会采用单例模式。通俗的解释就是类只建立一次实例,贯穿整个生命周期,实现了高性能。

#1.模块化单例
#所谓的模块化就是一个单独的.py文件来存储类,这样就是单例模式。
#其原理就是模块被导入时会产生一个.pyc文件,其它文件在导入的时候不会在去调用。直接读取pyc

#2.装饰器单例模式
#原理也很简单,用装饰器装饰类。
#装饰器自己实现,传入类对象,进行判读是否是一个实例,若是是直接返回该实例(须要注意是直接返回,再也不建立)。
#若是不是一个实例,那么建立该实例,并把该实例保存在一个变量中,用来标记实例已被建立。

#实现单例模式装饰器
def sing(cls): save_instance = {} def _wrap(*args, **kwargs): #若是cls没在save_instance中说明,cls是第一次建立实例
        if not 'cls' in save_instance: save_instance['cls'] = cls(*args, **kwargs) #注意这里的括号,实例化一个类要带括号不然就是类对象
        return save_instance['cls'] #把实例返回。
    return _wrap

示例1:
class Sing_Cls_Demo(): def __init__(self, x, y): self.x = x self.y = y a1 = Sing_Cls_Demo(1, 2) a2 = Sing_Cls_Demo(3, 4) print(a1) print(a2)

#示例1结果:从如下结果能够看出,不是同一个实例对象
# <__main__.Sing_Cls_Demo object at 0x036692B0> # <__main__.Sing_Cls_Demo object at 0x03669730>

示例2:
@sing class Sing_Cls_Demo(): def __init__(self, x, y): self.x = x self.y = y a1 = Sing_Cls_Demo(1, 2) a2 = Sing_Cls_Demo(3, 4) print(a1) print(a2)
#示例2结果:给类带上装饰器,从结果看出,两个类初始化,只建立了一个实例。
# <__main__.Sing_Cls_Demo object at 0x034D9050> # <__main__.Sing_Cls_Demo object at 0x034D9050>
 

 

 

#3类模式的单例
#原理其实同样,咱们先在类中埋一个属性,或者一个变量也能够。以后判断这个是否存在预设标记,存在原样返回。不存在建立返回。
#如下代码只是类实现的一种方例。
class Sing():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    #这里咱们经过方法来给类作标记。  实例化时也调用该方法。
    @classmethod
    def instance(cls, *args, **kwargs):
        if not hasattr(Sing,'instance_flag'): #判断若是没有这个属性,说明类没被实例化过。
            Sing.instance_flag = Sing(*args, **kwargs)
        return Sing.instance_flag


a1 = Sing.instance(1, 2)
a2 = Sing.instance(3, 4)

print(a1)
print(a2)

#输出结果,能够看出是同一实例对象。
# <__main__.Sing object at 0x03479730>
# <__main__.Sing object at 0x03479730>
#以上存在的问题。若是是多线程下有几率的会出现问题。能够加上线程锁来解决这问题。
#4__new__模式原理是同样的,不在重复。  在python中类被实例化的时候最早执行的是__new__文章就是从__new__开始。在这里作判断,第一次实例一下返回,不是第一次原样返回。
相关文章
相关标签/搜索