newbie_evolve's Blog

Happy coding
Python设计模式之“工厂方法模式”
Python设计模式之“抽象工厂模式”

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用法

第四种实现:是方法一的高级版,使用装饰器


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter