- Python如何实现单例模式
单例模式是设计模式里面最为基本的一种。
动机是:一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务。
特点是:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
具体实现是:
主要掌握两种:一是__new__ 方法,这种方法就是定义类的时候,将类实例化为变量_instance,那么,每定义一个对象,这个对象就是_instance了,先上代码。
class Singleton(object):
def __new__(self, *args, **kwargs):
if not hasattr(self, '_instance'):
orig = super(Singleton, self)
Singleton._instance = orig.__new__(self, *args, **kwargs)
return Singleton._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
print id(one)
print id(two)
print one == two
print one is two
##3
##30580464
##30580464
##True
##True
注解:_instance,变量名_xxx被看作是“私有的”,在模块或类外不可以使用。参考http://blog.csdn.net/frankarmstrong/article/details/8866351
self,是python默认的指向本类的一个变量。参考http://sjolzy.cn/Why-should-self-Python.html
*args、**kwargs,这两个变量要涉及到python里面的星号的作用,一个星号表示位置变量,两个表示关键字变量。参考http://blog.csdn.net/qinyilang/article/details/5484415
hasattr(obj,name) 查看一个obj的name space中是否有name
super(B, self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象self.
另外一种方法是共享属性,共享属性。所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法) ,同一个类的所有实例天然拥有相同的行为(方法), 只需要保证同一个类的所有实例具有相同的状态(属性)即可 ,所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)
class Singleton(object):
_state = {}
def __new__(self, *args, **kwargs):
ob = super(Singleton,self).__new__(self, *args, **kwargs)
ob.__dict__ = self._state
return ob
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
print id(one)
print id(two)
print one == two
print one is two
print id(one.__dict__)
print id(two.__dict__)
##3
##31039216
##31039440
##False
##False
##31145536
##31145536