一、单例模式
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,**kwargs): if not hasattr(Singleton,"_instance"): with Singleton._instance_lock: if not hasattr(Singleton,"_instance"): Singleton._instance=object.__new__(cls,**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,]) 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,**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,**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)您可能感兴趣的文章:Python设计模式之单例模式实例常见的在Python中实现单例模式的三种方法5种Python单例模式的实现方式python单例模式实例分析详解python单例模式与metaclassPython单例模式实例详解 总结
以上是内存溢出为你收集整理的Python中单例模式总结全部内容,希望文章能够帮你解决Python中单例模式总结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)