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程 ...
随机推荐
- 洛谷训练场——简单模拟 排座位(P1056)
题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳. 同 ...
- Vue - 项目配置 ( element , 安装路由 , 创建路由 )
1,安装element : vue add element 2,安装路由 : vue add router 3,创建路由的过程 : (1) 新建 vu ...
- [JZOJ]3413.KC的瓷器
Description KC来到了一个盛产瓷器的国度.他来到了一位商人的店铺.在这个店铺中,KC看到了一个有n(1<=n<=100)排的柜子,每排都有一些瓷器,每排不超过100个.那些精美 ...
- python基础(变量,字符串,列表,元组)
#列表的操作list1 = ['wuqiang','lichang','changhao'] #列表的定义print(list1) #操作列表print(list1[-1]) #操作列表的最后一位li ...
- java核心-多线程-零碎知识收集
1.不能使用Integer作为并发锁 原因:synchronized(Integer)时,当值发生改变时,基本上每次锁住的都是不同的对象实例,想要保证线程安全,推荐使用AtomicInteger之类会 ...
- 深入浅出KNN算法
概述 K最近邻(kNN,k-NearestNeighbor)分类算法 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心思想是如果一个样本在特征 ...
- 032-PHP中关于数组排序的usort()函数
<?php function re($a, $b) { return ($a < $b) ? 1 : -1; } $x = array(1, 3, 2, 5, 9); usort($x, ...
- 实验吧-隐写术-九连环(steghide)
下载图片: 拿到kali里binwalk发现有压缩文件,然后foremost分解出来,将分出的压缩文件打开,发现已经被加密. 到这里就有几个思路了:1)暴力破解 2)伪加密 3)继续从图片中寻找信息 ...
- 创建一个简单的Spring应用
环境已经安装完成,接下来创建一个简单的Spring应用. 创建Spring应用步骤: 创建一个maven项目 添加spring库依赖 创建Bean类 添加Bean的xml装配文件 创建主类 运行应用程 ...
- ACM-Alice and Bob
题目描述:Alice and Bob One day, Alice asks Bob to play a game called “K-in-a-row”. There is a game board ...