首页 > 编程 > Python > 正文

Python中单例模式总结

2020-01-04 15:50:27
字体:
来源:转载
供稿:网友

一、单例模式

    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)


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表