Python设计模式之“单例模式”
newbie_evolve
posted @ 2013年8月16日 15:55
in python之年
, 1338 阅读
有一些类,应该只有一个实例。这个实例似乎应该在程序启动时被创建出来,且只有在程序结束时才被删除。
单例模式没有公开的构造器,即其构造器是私有的
http://blog.csdn.net/ghostfromheaven/article/details/7671853
python真的需要像其他编程语言中的单例模式吗?
答案是:不需要!
因为python有模块,它是python的单例典范。
模块在一个应用程序中只有一份,它本身就是单例的。将你所需要的属性和方法,直接暴露在模块中变成模块的全局变量和方法即可。
Python单例模式的4种实现方法:
第一种实现:实现__new__方法
class Singleton(object):
def __new__(cls,*args,**kw):#重写__new__
if not hasattr(cls,'_instance'):cls是否含有_instance
orig = super(Singleton,cls) #super(Singleton,cls)调用父类object的对象
cls._instance = orig.__new__(cls,*args,**kw) #调用object的__new__方法生成对象,并赋给cls._instance
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
###这里的one和two是同一个对象
python中的__new__:创建对象时调用,返回当前对象的一个实例
_init__:创建对象后调用,对当前对象的实例做一些初始化,无返回值
class A(object):
def __init__(self):
print "in init"
def __new__(self):
print "in new"
>>>A()
in new
如果重写了__new__而没有 return instance 那么__init__就不起作用。这说明__new__优先于__init__
第二种实现:共享属性,所谓单例就是所用引用具有相同的属性和方法,同一个类的所有实例自然拥有相同的行为(方法)。所有实例共享属性的最简单最直接的方法就是__dict__属性指向同一个字典。
class Borg(object):
_state = {}
def __new__(cls,*args,**kw):
ob = super(Borg,cls).__new__(cls,*args,**kw)
ob.__dict__ = cls._state
return ob
class MyClass(Borg):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
###这里的one和two是不同对象
第三种实现:是方法一的高级版,使用__metaclass__(元类)的高级python用法
第四种实现:是方法一的高级版,使用装饰器