Python中的单例模式
2020-02-17 03:09
627 查看
1.理解单例模式:
单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,
通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案.
-
某个类只能有一个实例
-
它必须创建这个实例
-
它必须自行向整个系统提供这个实例
-
但是从具体角度实现来说的话,又可以分为三点
单例模式的类只能提供私有的构造函数
-
类定义中含有一个该类的静态私有对象
-
该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象
总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!
2.实现单例模式的方法:
-
使用模块
-
#test.py class MyClass(object): def foo(self): print('MyClass.foo') my_class_obj=MyClass() 将上面的代码保存在文件 test.py 中,然后这样使用: 将上面的代码保存在test.py 文件中就可以 from .test import my_class_obj my_class_obj.foo()
-
使用
__new__
-
class Teacher: flag = None def __new__(cls, *args, **kwargs): if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name
#保证线程安全添加锁(推荐使用)
class Teacher: from threading import Lock lock = Lock() flag = None def __new__(cls, *args, **kwargs): with cls.lock: if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name -
使用装饰器(decorator)
-
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
-
使用元类(metaclass)
-
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] # Python2 # class MyClass(object): # __metaclass__ = Singleton # Python3 class MyClass(metaclass=Singleton): pass
转载于:https://www.cnblogs.com/changtao/p/10732737.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Python中区分函数和方法
- Python之时间复杂度
- Python学习之崖(1)
- python import MySQLdb报错
- python2与python3的区别
- Python定时任务框架:APScheduler源码剖析(三)
- 使用Python实现RPC框架
- Error loading Python DLL ‘python36.dll'. LoadLibrary: 找不到指定的模块。
- python基础
- Python与PLC踩坑实录:成功解决西门子 PLC S7-200_SMART与PC连接时不能同时用Python的snap7包和step7软件同时连接
- [python] raw string,反斜杠\,re Lib
- [python] matplotlib 中文汉字 更改字体
- Python学习笔记之——生成器和迭代器
- python列表,字典排序
- python连接数据库的几种方式!
- 用python爬取伯乐在线的准备
- 模拟登录知乎selenium在python中
- python 爬取伯乐在线完整版
- python 爬取知乎完整版
- Windows下python的安装包的网址