首页 > 代码库 > Python单例模式剖析
Python单例模式剖析
在聊这之前我们首先要明确的是,单例模式在实际中的意义以及在python中具有实现的价值?
当前,相信有很多人支持单例模式,也有不少人反对,尤其是在python中,目前依旧具有很大的争议性。我们要在评论之前首先要了解单例模式
什么是单例模式?
顾名思义:就是单个模式
单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案。
单例模式的要点有三类
- 某个类只能有一个实例
- 它必须创建这个实例
- 它必须自行向整个系统提供这个实例
但是从具体角度实现来说的话,又可以分为三点
- 单例模式的类只能提供私有的构造函数
- 类定义中含有一个该类的静态私有对象
- 该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象
一、实例控制
常用几种方式
通过面向的特性,简单的构造出单例模式
# ########### 单例类定义 ########### class Foo(object): __instance = None @staticmethod def singleton(): if Foo.__instance: return Foo.__instance else: Foo.__instance = Foo() return Foo.__instance # ########### 获取实例 ########### obj = Foo.singleton()
当用于WEB界面时,单例模式的简单运用
1 #!/usr/bin/env python 2 #coding:utf-8 3 from wsgiref.simple_server import make_server 4 5 # ########### 单例类定义 ########### 6 class DbHelper(object): 7 8 __instance = None 9 10 def __init__(self): 11 self.hostname = ‘1.1.1.1‘ 12 self.port = 3306 13 self.password = ‘pwd‘ 14 self.username = ‘root‘ 15 16 @staticmethod 17 def singleton(): 18 if DbHelper.__instance: 19 return DbHelper.__instance 20 else: 21 DbHelper.__instance = DbHelper() 22 return DbHelper.__instance 23 24 def fetch(self): 25 # 连接数据库 26 # 拼接sql语句 27 # 操作 28 pass 29 30 def create(self): 31 # 连接数据库 32 # 拼接sql语句 33 # 操作 34 pass 35 36 def remove(self): 37 # 连接数据库 38 # 拼接sql语句 39 # 操作 40 pass 41 42 def modify(self): 43 # 连接数据库 44 # 拼接sql语句 45 # 操作 46 pass 47 48 49 class Handler(object): 50 51 def index(self): 52 obj = DbHelper.singleton() 53 print id(single) 54 obj.create() 55 return ‘index‘ 56 57 def news(self): 58 return ‘news‘ 59 60 61 def RunServer(environ, start_response): 62 start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)]) 63 url = environ[‘PATH_INFO‘] 64 temp = url.split(‘/‘)[1] 65 obj = Handler() 66 is_exist = hasattr(obj, temp) 67 if is_exist: 68 func = getattr(obj, temp) 69 ret = func() 70 return ret 71 else: 72 return ‘404 not found‘ 73 74 if __name__ == ‘__main__‘: 75 httpd = make_server(‘‘, 8001, RunServer) 76 print "Serving HTTP on port 8001..." 77 httpd.serve_forever() 78 79 Web应用实例-单例模式
不过我们需要注意的是:
特殊方法__new__是一个元构造程序,每当一个对象必须被factory类实例化时,就将调用它。__new__方法必须返回一个类的实例,因此它可以在对象创建之前或之后修改类。
因为__init__在子类中不会被隐式调用,所以__new__可以用来确定已经在整个类层次完成了初始化构造。__new__是对于对象状态隐式初始化需求的回应,使得可以在比__init__更低的一个层次上定义一个初始化,这个初始化总是会被调用。
与__init__()相比__new__()方法更像一个真正的构造器。随着类和类型的统一,用户可以对内建类型进行派生,因此需要一种途径来实例化不可变对象,比如派生字符串,在这种情况下解释器则调用类的__new__()方法,一个静态方法,并且传入的参数是在类实例化操作时生成的。__new__()会调用父类的__new__()来创建对象(向上代理)
·__new__必须返回一个合法的实例,这样解释器在调用__init__()时,就可以吧这个实例作为self传给他。调用父类的__new__()来创建对象,正向其他语言使用new关键字一样
总结
单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
Python单例模式剖析