单例模式(SingletonPattern)》单例模式(SingletonPattern)是一种比较简单的模式,它的定义如下:确保一个类只有一个实例,并提供全局指向访问它。(确保某个类只有一个实例,并实例化自己并将这个实例提供给整个系统。)》摘自:秦晓波.《设计模式之禅(第2版)(华章原创精品)》.iBooks.DefineUML实例可以通过plantuml@startumlclass查看Singleton{+name}notetop:Singletonhasa'name'property.这里的Singleton代表下面代码中的File类classClientnoteleft:clientgetonesingletoninstanceClient-->Singleton@enduml由于这个markdown不能显示,贴图代码实现importthreadingimporttimeclassSingleton(type):def__new__(cls,*args,**kwargs):返回类型,**kwargs)def__call__(self,*args,**kwargs):ifself.__instanceisNone:#time.sleep(2)模拟线程切换,此时不保证多线程单例实现self.__instance=super().__call__(*args,**kwargs)returnself.__instanceelse:returnself.__instanceclassFile(metaclass=Singleton):def__init__(self,name):self.name=namedefcreate_file_instance(name):f=File(name)print(f)#if__name__=="__main__":#thread1=threading.Thread(target=create_file_instance,args=('abc',))#thread2=threading.Thread(target=create_file_instance,args=('bcd',))#thread1.start()#thread2.start()#如果有sleep就会出现这个:#<__main__.Fileobjectat0x1052d34a8>#<__main__.Fileobjectat0x1052d3390>#如果没有大概率不会出现不一致,因为代码消耗的cpu时间很短,不足以引起线程切换---#defsynchronized(func):func.__lock__=threading.Lock()deflock_func(*args,**kwargs):withfunc.__lock__:返回func(*args,**kwargs)返回lock_funcclassSingletonSync(type):def__init__(self,*agrs,**kwargs):self.__instance=Nonesuper().__init__(*agrs,**kwargs)@synchronizeddef__call__(self,*args,**kwargs):如果self.__instance为None:time.sleep(2)self.__instance=super().__call__(*args,**kwargs)returnself.__instanceelse:returnself.__instanceclassFileSync(metaclass=SingletonSync):def__init__(self,name):self.name=namedefcreate_file_instance_sync(name):f=FileSync(name)打印(f)if__name__=="__main__":thread1=threading.Thread(target=create_file_instance_sync,args=('abc',))thread2=threading.Thread(target=create_file_instance_sync,args=('bcd',))thread1.start()thread2.start()#<__main__.FileSyncobjectat0x10fbd43c8>#<__main__.FileSyncobjectat0x10fbd43c8>参考代码:PythonCookbook-Chapter9.13.2同步锁机制:https://blog.csdn.net/lucky40...知识点学习《设计模式之禅》本书,但是没有用过java语言,于是突发奇想,结合设计模式书籍,参考python相关书籍编写python设计模式实例。和java相比,singleton应该是对设计模式最理解和最好写的代码了,但是对于python来说,我这个小白,还是学到了很多知识点。元类(__metaclass__)元类可以指定一个类的元类,什么是元类?它是创建类的类。-存在意义:拦截类的创建,修改类,返回修改后的类。-回到我们的单例模式,它是使用元类实现的。Singleton类是File类的元类。可以理解为Singleton创建了File类(注意是类而不是类的实例)。具体来说,调用了__new__方法。__metaclass__是一种实现自定义元类的方法。没有太多的解释。有兴趣的可以参考下面两篇文章。比较好,还有元类更好的应用场景https://www.cnblogs.com/西蒙...https://www.liaoxuefeng.com/wiki/1016959663602400/1017592449371072__new__方法:很基础的知识points,newe函数是init执行前执行的函数,new函数是真正创建类的函数,new函数会一步步寻找__metaclass__(元类方法)。如果找到它,它将执行它。如果找不到,它会继续寻找父类。如果没有,它最终将被转移到类型。type也是一个元类,它就像int、string等。元类是创建int和string__call__方法的类型:执行File()时调度的函数。所有定义了call方法的类都可以称为可执行的,也就是说,它们可以作为一个函数来执行。说完这些知识点,如果你对元类或者call方法不是很了解,你可能还是看不懂这个单例的执行。一个简单的方法是返回并尝试一下。先说代码执行过程(只介绍创建File的过程):在执行File()之前,在定义和传递File时执行Singleton的new函数,目的是创建这个File类,即why之所以写new函数,其实不写也不会影响单例模式,然后执行Singleton的init,目的是创建一个instance实例,实例名也是有讲究的。双下划线表示隐私属性不会被覆盖。接下来,在执行File函数时调用call方法。sleep函数是模拟线程之间的切换。如果没有高概率的切换,就不会出现创建两个不同实例的情况。下集预告:给自己讲讲工厂模式,应该是给自己学习的动力吧!
