Python—程序设计:单例模式
单例模式
单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,并提供一种访问其唯一对象的方式。
特点:
1.单例类只能有一个实例
2.单利类必须自己创建自己的唯一实例
3.单例类必须给其他对象提供这一实例
解决问题:
一个全局使用的类,频繁的创建于销毁。
使用场景:
需要控制实例数目,节省系统资源的时候。
创建方法:
判断单例类当前是否存在实例,如果有则返回这个实例,没有就创建
实际用法:
1.创建一个对象需要消耗过多的资源,比如I/O与数据库连接等
2.Web中的计数器,不用每次刷新都在数据库里加一次,先用单利缓存起来
3.线程池的设计一般也才有单例模式,方便线程控制
4.应用程序的日志应用,一般都何用单例模式实现,由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
代码实现:
1.使用模块
# 1.使用模块:
"""Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,
当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。""" class Singleton(object): def foo(self):
pass singleton = Singleton() # 将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象
# from mysingleton import singleton
2.使用元类metaclass
# 2.使用元类metaclass
"""
1.类由type创建,创建类时,type的__init__方法自动执行,类实例化,执行type的 __call__方法
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 __call__ 方法
""" class Singleton(type):
"""
在元类Singleton的__call__方法对类属性__instance进行判断,如果__instance为None,
说明类还未进行实例化,那么调用元类的父类(元类是type的子类)type的__call__方法,
同时赋值给 cls.__instance。如果 cls.__instance 不为None,
说明类已经进行过实例化,直接返回之前存储在类属性cls.__instance 中的类实例,即实现单例模式。
"""
def __init__(cls, *args, **kwargs):
cls.__instance = None
super().__init__(*args, **kwargs) def __call__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = super().__call__(*args, **kwargs)
return cls.__instance class Foo(metaclass=Singleton):
pass foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)
3.使用__new__方法
# 3.使用__new__方法
class Singleton(object):
"""当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.__new__),
实例化对象,然后再执行类的__init__方法,对这个对象进行初始化,
所有我们可以基于这个,实现单例模式""" def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'): # 关键在于每一次实例化,我们都返回这同一个_instance对象
cls._instance = super().__new__(cls)
return cls._instance class Foo(Singleton):
def __init__(self):
pass foo1 = Foo()
foo2 = Foo()
print(foo2 is foo1)
4.使用装饰器
# 4.使用装饰器
def singleton(cls):
instance = {} def get_singleton(*args, **kwargs):
if cls not in instance: # 判断是否存在字典中
instance[cls] = cls(*args, **kwargs) # 这里相当于Foo()
return instance[cls] return get_singleton @singleton
class Foo:
pass foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)
Python—程序设计:单例模式的更多相关文章
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- Python题集:2019春Python程序设计选修课习题笔记
一.判断题: 1-1.在Python 3.x中可以使用中文作为变量名. 答案:√ 1-2.Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型. 答案:× 1-3.Python ...
- Python 基于python实现单例模式
基于python实现单例模式 by:授客 QQ:1033553122 概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...
- python 以单例模式封装logging相关api实现日志打印类
python 以单例模式封装logging相关api实现日志打印类 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7 实现功能: 支持自由配置,如下lo ...
- python的单例模式:
python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...
- 【Python】单例模式Singleton
前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...
- python程序设计——基本语言特性
参考<Python程序设计(第2版)> 清华大学出版社 董付国 ##### 除特殊说明外,以下代码示例,均为python 3.6版本 ##### 一.Python语言特性 1.python ...
- 浅谈Python设计模式 - 单例模式
本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...
- Python程序设计基本方法图
Python程序设计基本方法图
- 2019春Python程序设计作业2(0326--0401)
1-1 已知st="Hello World!",使用print(st[0:-1])语句可以输出字符串变量st中的所有内容. (2分) T F 1-2 Python程 ...
随机推荐
- POJ 2829 Buy Tickets
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 26443 Accepted: 12639 Des ...
- 搭建selenium+Python+eclipse 的开发环境
下载安装Python,下载“python-2.7.9.msi”后可直接安装 下载安装setuptools,下载setuptools-11.3.1后,用命令提示符转到安装包中setup.py所在的位置, ...
- vue-cli 局域网可访问配置
vue-cli 使用官方脚手架搭建以后,本地的config配置已经没有了,默认打开localhost,无法ip访问 只要修改项目目录配置和防火墙配置 1.在项目根目录下面加一个文件vue.config ...
- PHPmyadmin Getshell(10.25 第二十七天)
PHPmyadmin Getshell的方法(1)show global variables like '% secure-file-priv%' 如果该参数设置为空或者指定的文件夹可以利用,然后写木 ...
- WIN10打开资源管理器显示该文件没有与之关联的程序来执行该操作.请安装应用,请在“默认应用设置”..关联 —— 解决方案
win+R,输入regedit,分别在HKEY_CLASSES_ROOT\piffileHKEY_CLASSES_ROOT\InternetShortcutHKEY_CLASSES_ROOT\lnkf ...
- xml配置文件解释
XML 指可扩展标记语言(EXtensible Markup Language) xmlns:是指XML命名空间 ( XML Namespace ) XSD是指XML结构定义 ( XML Schema ...
- excel处理经纬度
=LEFT(A1,FIND("°",A1)-1)*1+MID(A1,FIND("°",A1)+1,2)/60+MID(A1,FIND("′" ...
- JS确认取消按钮使用
前几天写程序用到了点击提交之后弹出一个信息框确认提交有取消和确定按钮查阅了资料记录一手 if(window.confirm('你确定要提交吗?提交后将无法更改!')){ //这里填写提交代码 retu ...
- LeetCode简单题汇总
1.两个数之和 给出一个整数数组,请在数组中找出两个加起来等于目标值的数, 你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index ...
- 基于云开发开发 Web 应用(四):引入统计及 Crash 收集
在完成了产品的基础开发以后,接下来需要进行一些周边的工作,这些周边工具将会帮助下一步优化产品. 为什么要加应用统计和 Crash 收集 不少开发者在开发的时候,很少会意识到需要添加应用统计和 Cras ...