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程 ...
随机推荐
- Spark 下操作 HBase(1.0.0 新 API)
hbase1.0.0版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应该尽早地来熟悉下新版API.并且了解下如何与当下正红 ...
- Fr3设置图片打印
见 fr3的文件内容,为xml <?xml version="1.0" encoding="utf-8"?> <TfrxReport Vers ...
- uni-app实现弹窗遮罩
<template> <view> <view class="systemboxItem" @click="showSystemDialog ...
- 关于linux 交叉编译器的安装
找了几个贴 https://www.cnblogs.com/uestc-mm/p/6656325.html 这个最好
- Jrebel 远程热部署[Idea]
服务器端 客户端-idea remote module 在服务器端,Tomcat的webapps下新建项目文件夹,如: demo/WEB-INF/classes/[jrebel.xml]
- 039-PHP使用闭包函数来进行父实例的变量自增,错误示例
<?php // 如何使用闭包函数来进行父实例的变量自增,错误示例 function demo(){ $num = 1; $func = function() use($num){ echo $ ...
- 图解HTTP阅读笔记2
TCP协议:三次握手,C端——>SYN——>S端: S端——>SYN/ACK——>C端: C端——>ACK——>S端. 特点:字节流服务,把大块数据分割成以报文段为 ...
- 通过Navicat Premium 实现Oracle的连接和基本操作
一.Oracle的连接 以下为Navicat Premium连接Oracle数据库的教程 一.需要准备的软件(下载适合自己系统的软件) 1.Navicat premium 官方下载地址:http:// ...
- P 1030 完美数列
转跳点:
- 【pwnable.kr】random
pwnable从入门到放弃第七题. ssh random@pwnable.kr -p2222 (pw:guest) 目前为止做的最快的一道题... #include <stdio.h> i ...