Python单体模式的几种常见实现方法详解
本文实例讲述了Python单体模式的几种常见实现方法。分享给大家供大家参考,具体如下:
这里python实现的单体模式,参考了:https://stackoverflow.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852
一、修改父类的__dict__
classBorg: _shared_state={} def__init__(self): self.__dict__=self._shared_state classSingleton(Borg): def__init__(self,name): super().__init__() self.name=name def__str__(self): returnself.name x=Singleton('sausage') print(x) y=Singleton('eggs') print(y) z=Singleton('spam') print(z) print(x) print(y)
注意,这种方法实现的并非真正的单体模式!!
下面几种方法实现的才是真正的单体模式
二、使用元类
先看看这里关于元类的描述:
元类一般用于创建类。
在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__。如果还没有发现__metaclass__属性,解释器会检查名字为__metaclass__的全局变量,如果它存在,就使用它作为元类。否则,使用内置的type作为此类的元类。
1.继承type,使用__call__
注意__call__的参数
classSingleton(type): _instance=None def__call__(self,*args,**kw): ifself._instanceisNone: self._instance=super().__call__(*args,**kw) returnself._instance classMyClass(object): __metaclass__=Singleton print(MyClass()) print(MyClass())
2.继承type,使用__new__
注意__new__的参数
classSingleton(type): _instance=None def__new__(cls,name,bases,dct): ifcls._instanceisNone: cls._instance=super().__new__(cls,name,bases,dct) returncls._instance classMyClass(object): __metaclass__=Singleton print(MyClass()) print(MyClass())
3.继承object,使用__new__
注意__new__的参数
classSingleton(object): _instance=None def__new__(cls): ifcls._instanceisNone: cls._instance=super().__new__(cls) returncls._instance classMyClass(object): __metaclass__=Singleton print(MyClass()) print(MyClass())
下面还有一个很巧妙的方法实现单体模式
使用类方法classmethod
classSingleton: _instance=None @classmethod defcreate(cls): ifcls._instanceisNone: cls._instance=cls() returncls._instance def__init__(self): self.x=5#orwhateveryouwanttodo sing=Singleton.create() print(sing.x)#5 sec=Singleton.create() print(sec.x)#5
更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。