Python 单例模式
2015-08-27 10:22
786 查看
实现python单例模式有很多种方式, 这里只列出几个常用的以供参考,欢迎提出意见,本人小菜。
1、装饰器 : 利用“装饰器只会执行一次”这个特点
代码如下
2、基类 (类变量对所有对象唯一)
代码如下
3、metaclass (类变量对所有对象唯一), 这种方式我不是很懂,先理解一下
4、利用import (模块只会被import一次)
然后在其它模块,from mysingleton import f
直接拿f当作单例的对象来用, 这种方式挺扯的,还是不要用为好,其实还是第一种最实用。
1、装饰器 : 利用“装饰器只会执行一次”这个特点
代码如下
def singleton(cls): instances = []# 为什么这里不直接为None,因为内部函数没法访问外部函数的非容器变量 def getinstance(*args, **kwargs): if not instances: instances.append(cls(*args, **kwargs)) return instances[0] return getinstance @singleton class Foo: a = 1 f1 = Foo() f2 = Foo() print id(f1), id(f2)
2、基类 (类变量对所有对象唯一)
代码如下
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance class Foo(Singleton): a = 1
3、metaclass (类变量对所有对象唯一), 这种方式我不是很懂,先理解一下
class Singleton(type): def __call__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance class Foo(): __metaclass__ = Singleton
4、利用import (模块只会被import一次)
在文件mysingleton中 class Foo(object): pass f = Foo()
然后在其它模块,from mysingleton import f
直接拿f当作单例的对象来用, 这种方式挺扯的,还是不要用为好,其实还是第一种最实用。
相关文章推荐
- Python 之 使用Tkinter 做GUI 研究机器人走迷宫
- 理解 Python 中的 *args 和 **kwargs
- [python] 数据库操作
- Python subprocess注意问题
- python-sqlite3模块
- python pandas dataframe 去重函数
- python包的安装与卸载
- python setuptools工具
- 【转】一小时学会用Python Socket 开发可并发的FTP服务器!!
- python pip工具
- python中的setup.py详解
- 用好Python帮助函数help(),dir(),type()
- Python初学(6)——Python的函数
- python 爬取某网站图片(娱乐向)
- Python CGI 模块剖析
- Python实现的knn算法示例
- 两个使用Python脚本操作文件的小示例分享
- 计蒜客题库(Python):5、矩阵翻转
- 计蒜客题库(Python):6、泥塑课
- python使用pip安装gevent时提示Unable to find vcvarsall.bat