python使用__new__来实现singleton单例模型
2014-02-18 00:00
609 查看
摘要: 实现singleton单例模型
在软件设计过程中,根据需求需要实现singleton单例模型。比如创建数据库的连接实例。下面利用python新式类里的__new__的静态方法来实现。
__new__原型为object.__new__(cls,[...]),cls是一个类对象。当你调用C(*arg, **kargs)来创建一个类C的实例时。python内部调用是C.__new__(C, *arg, **kargs),然后返回值是类C的实例c。在确认c是C的实例后,python再调用C.__init__(c, *arg, **kargs)来实例化c。
所以调用一个实例c=C(2),实际执行的代码为:
object.__new__创建一个新的,没有经过初始化的实例。当你重写__new__方法时,可以不用使用修饰器@staticmethod指明它是静态函数。解释器会自动判断这个方法为静态方法。如果需要重新绑定C.__new__方法时,只要在类的外面执行C.__new__=staticmethod(youfunc)就可以了。
下面使用__new__来实现Singleton单例模型。
可以看出两个实例是指向同一个内存地址。Singleton所有子类也有这一个特性。只有一个实例对象。如果它的子类定义了__init__方法,那么必须保证它的__init__ 方法能够安全的同一个实例进行多次调用。
在软件设计过程中,根据需求需要实现singleton单例模型。比如创建数据库的连接实例。下面利用python新式类里的__new__的静态方法来实现。
__new__原型为object.__new__(cls,[...]),cls是一个类对象。当你调用C(*arg, **kargs)来创建一个类C的实例时。python内部调用是C.__new__(C, *arg, **kargs),然后返回值是类C的实例c。在确认c是C的实例后,python再调用C.__init__(c, *arg, **kargs)来实例化c。
所以调用一个实例c=C(2),实际执行的代码为:
c = C.__new__(C, 2) if isinstance(c, C): C.__init__(c, 2)
object.__new__创建一个新的,没有经过初始化的实例。当你重写__new__方法时,可以不用使用修饰器@staticmethod指明它是静态函数。解释器会自动判断这个方法为静态方法。如果需要重新绑定C.__new__方法时,只要在类的外面执行C.__new__=staticmethod(youfunc)就可以了。
下面使用__new__来实现Singleton单例模型。
class Singleton(object): _singleton = {} def __new__(cls): if not cls._singleton.has_key(cls): cls._singleton[cls] = object.__new__(cls) return cls._singleton[cls]
可以看出两个实例是指向同一个内存地址。Singleton所有子类也有这一个特性。只有一个实例对象。如果它的子类定义了__init__方法,那么必须保证它的__init__ 方法能够安全的同一个实例进行多次调用。
相关文章推荐
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
- 使用 __new__ 实现 Python 的单例模式
- Python中使用 metaclass 实现Singleton 模式
- 使用VTK与Python实现机械臂三维模型可视化
- 使用Python的Queue实现线程/进程间通信
- Python使用sftp实现上传和下载功能(实例代码)
- 使用Python之paramiko模块和threading实现多线程登录多台Linux服务器
- Python多线程 - 使用threading模块实现多线程的 3 种方式
- 使用python实现拉钩网上的FizzBuzzWhizz问题示例
- Selenium - Python下使用pageobject实现自动化测试
- 使用Python实现子区域数据分类统计
- python文件编译成so介绍 - 2.使用makefile将py文件编译成so文件并制作成rpm包,实现自动化
- [模拟登陆三剑客]3. 使用Python实现模拟登陆
- python 使用paramiko, pymysql实现批量管理服务器
- 在Python中使用AOP实现Redis缓存示例
- 【Python-3.3】使用while循环实现列表间数据移动
- python使用reportlab实现图片转换成pdf的方法
- 数据预处理(3) ——数据归约 使用python(sklearn,pandas,numpy)实现
- Python中使用select模块实现非阻塞的IO
- 【Python】使用reduce和map函数实现str转int