python设计模式之单例模式你了解多少
作者:托塔天王李 发布时间:2022-07-01 21:40:22
标签:python,设计模式,单例模式
单例模式
概念
单例模式:“保证一个类仅有一个实例,并提供一个访问它的在这里插入代码片全局访问点。
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
单例模式使用场景
- Web应用的配置对象的读取
- Windows的Task Manager(任务管理器)
- 网站的计数器,一般也是采用单例模式实现,否则难以同步
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源
- 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
-
python实现单例模式
函数装饰器实现单例
def singleton(class_):
instances = {)
def get_instance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*argx, **kwargs)
return instances[class_]
reyurn get_instance
@singleton
class Cls(object):
def __init__(self):
pass
cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))
输出结果:
True
instances = {)
使用不可变的类地址作为键,其实例作为值,每次创造实例时,首先查看该类是否存在实例,存在的话直接返回该实例即可,否则新建一个实例并存放在字典中。
使用模块 (常用)实现单例
作为python的模块是天然的单例模式
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
基于__new__实现的单例模式(最常用)
类(class)通过方法 new 创造了实例(instance)
class Single(object):
_instance = None
def __new__(cls, *args, **kw):
if cls._instance is None:
orig = super(Single, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
def __init__(self):
pass
single1 = Single()
single2 = Single()
print(id(single1) == id(single2))
如果 _instance 为 None,则新建实例,否则直接返回 _instance 存放的实例。
使用 metaclass 实现单例模式
元类(metaclass) 可以通过方法 metaclass 创造了类(class)
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]
class Cls4(metaclass=Singleton):
pass
cls1 = Cls4()
cls2 = Cls4()
print(id(cls1) == id(cls2))
我们将 metaclass 指向 Singleton 类,让 Singleton 中的 type 来创造新的 Cls4 实例
web应用配置文件单例实现
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class Config(dict):
"""
配置文件类 单例模式
"""
def __init__(self):
self.__can_import = True
self.__init_default()
dict.__init__(self)
def __init_default(self):
self['debug'] = False
self['autoreload'] = True
@property
def can_import(self):
return self.__can_import
def import_dict(self, **kwargs):
if self.__can_import:
for k, v in kwargs.items():
self[k] = v
self.__can_import = False
else:
raise Exception('ConfigImportError')
def clear(self):
self.__can_import = True
dict.clear(self)
self.__init_default()
来源:https://blog.csdn.net/qq_40861391/article/details/123241435
0
投稿
猜你喜欢
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 简介Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素。列表和元组这两种数据类型是最常被用到的序列
- 目录logging的简单使用|2logging常见对象|3logging基本使用|4logging之Formatter对象|5logging
- 本文实例讲述了Python定时任务sched模块用法。分享给大家供大家参考,具体如下:通过sched模块可以实现通过自定义时间,自定义函数,
- python 的语法定义和C++、matlab、java 还是很有区别的。1. 括号与函数调用def devided_3(x):  
- 没有gpu,改用cpu跑代码以为很麻烦的修改,很大动干戈的改动,以及无止尽的报错,结果,就改动代码中的device就OK了,惊不惊喜,意不意
- plt.imshow(image)无法显示图片的解决使用plt.imshow()发现不能显示图片,加了plt.show()也还是不能显示先引
- Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。gevent是第
- 前言利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰
- 在mysql中利用select语句的一个特性就可以很方便地实现查询结果的分页,select语句的语法:SELECT [STRAIGHT_JO
- 工作时需要取得MySQL中一个表的字段是否存在于是就使用Describe命令来判断mysql_connect(localhost, root
- 需求背景:进行分值计算。如下图,如果只是一两个还好说,写写判断,但是如果有几十个,几百个,会不会惨不忍睹。而且,下面的还是三种情况。例如:解
- OL定义有序列表的时候,除非指定list-style-position:inside;,否则文字和前导符是有缩进的。但有的时候,OL定义的列
- 原理:第一步:应用程序把查询SQL语句发给服务器端执行。我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给
- 需求:统计列表list1中元素3的个数,并返回每个元素的索引list1 = [3, 3, 8, 9, 2, 10, 6, 2, 8, 3,
- Python 语言的优势在于其功能强大,可以用于网络数据采集、数据分析等各种应用场景。本篇文章将介绍如何使用 Python 获取网络数据、使
- collections中defaultdict的用法一、字典的键映射多个值将下面的列表转换成字典一个字典就是一个键对应一个单值得映射,而上面
- 1.正则表达式是什么很简单就是一种字符串匹配,eg: 比如你在注册账户时我们需要对用户的用户名判断是否合法,这时候就需要对用户输入的检索,或
- 不过有一个简单的执行cmd命令方法: SQL> host net user User accounts for \\PC-ATQHJ4
- CSS3 + HTML5是未来的Web,它们都还没有正式到来,虽然不少浏览器已经开始对它们提供部分支持。本文介绍了5个CSS3技巧,可以帮你