Python之单例模式总结

2018-02-20 19:38:47来源:cnblogs.com作者:孟庆健人点击

分享

一、单例模式

    a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现

    b、类实现如下:

class Sigletion(objects):    import time    def __init__(self):        time.sleep(1)    @classmethod    def instance(cls,*args,**kwargs)        if not hasattr(Sigletion,'_instance'):            Sigletion._instance=Sigletion(*args,**kwargs)        return Sigletion._instanceimport threadingdaf task(arg):    obj=Sigletion.instance()    print(obj)for i in range(10):    t=threading.Thread(target=task,args=[i,])    t.start()

    c、基于__new__方法实现单例模式

import timeimport threadingclass Singleton(object):   _instance_lock=threading.Lock()   def __init__(self):       pass   def __new__(cls, *args, **kwargs):       if not hasattr(Singleton,"_instance"):           with Singleton._instance_lock:               if not hasattr(Singleton,"_instance"):                   Singleton._instance=object.__new__(cls,*args,**kwargs)       return Singleton._instanceobj1=Singleton()obj2=Singleton()print(obj1,obj2)def task(arg):    obj = Singleton()    print(obj)for i in range(10):    t = threading.Thread(target=task,args=[i,])    t.start()

    d、基于metaclass方式实现单例模式

"""1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)# 第0步: 执行type的 __init__ 方法【类是type的对象】class Foo:    def __init__(self):        pass    def __call__(self, *args, **kwargs):        pass# 第1步: 执行type的 __call__ 方法#        1.1  调用 Foo类(是type的对象)的 __new__方法,用于创建对象。#        1.2  调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。obj = Foo()# 第2步:执行Foodef __call__ 方法obj()"""
import threadingclass SingletonType(type):    _instace_lock=threading.Lock()    def __call__(cls, *args, **kwargs):        if not hasattr(cls, "_instance"):            with SingletonType._instace_lock:                if not hasattr(cls, "_instance"):                    cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)        return cls._instanceclass Foo(metaclass=SingletonType):    def __init__(self,name):        self.name=nameobj1 = Foo('name')obj2 = Foo('name')print(obj1,obj2)

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台