单例模式

  单例模式(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—程序设计:单例模式的更多相关文章

  1. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  2. Python题集:2019春Python程序设计选修课习题笔记

    一.判断题: 1-1.在Python 3.x中可以使用中文作为变量名. 答案:√ 1-2.Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型. 答案:× 1-3.Python ...

  3. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  4. python 以单例模式封装logging相关api实现日志打印类

    python 以单例模式封装logging相关api实现日志打印类   by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   实现功能: 支持自由配置,如下lo ...

  5. python的单例模式:

    python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...

  6. 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...

  7. python程序设计——基本语言特性

    参考<Python程序设计(第2版)> 清华大学出版社 董付国 ##### 除特殊说明外,以下代码示例,均为python 3.6版本 ##### 一.Python语言特性 1.python ...

  8. 浅谈Python设计模式 - 单例模式

    本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...

  9. Python程序设计基本方法图

    Python程序设计基本方法图

  10. 2019春Python程序设计作业2(0326--0401)

    1-1 已知st="Hello World!",使用print(st[0:-1])语句可以输出字符串变量st中的所有内容. (2分) T         F 1-2 Python程 ...

随机推荐

  1. php笔记04

    PHP+MySQL 连接数据库 mysqli <?php $servername="localhost"; $username="root"; $pass ...

  2. VMware CentOS网络配置

  3. USB Windows驱动 音频解决方案芯片DP108

    DP108是一款完全替代CM108的高度集成的单芯片USB音频解决方案芯片.方便的USB即插即用的兼容性,用户可以快速创建易用性,高质量和便携式USB音频产品基于高度集成的单芯片解决方案.所有重要的模 ...

  4. 洛谷 三月月赛 A

    模拟模拟 #include<bits/stdc++.h> using namespace std; inline int ra() { ,f=; char ch=getchar(); ; ...

  5. 让vscode使用Pipenv工作环境

    1.查看Pipenv的位置 # 先激活Pipenv环境 pipenv shell # 获取当前虚拟环境的位置 pipenv --venv 2.打开setting.json配置文件 Ctrl+Shift ...

  6. Codeforces Round #616 (Div. 2) 题解

    A. Even But Not Even 题意: 定义一个数所有位置的和为偶数它本身不为偶数的数为ebne,现在给你一个数字字符串,你可以删除任意位置上的数字使其变为ebne输出任意改变后的结果,如果 ...

  7. oracle基础知识小结

    一.查看oracle用户.角色信息1.查看所有用户 select * from all_users; select * from user_users; 2.查看用户或角色系统权限 select * ...

  8. 107-PHP类成员属性赋值

    <?php class mao{ //定义猫类 public $age; //定义多个成员属性 protected $weight; private $color; } $mao1=new ma ...

  9. ServletConfig详解

    ServletConfig是Servlet中的init()方法的参数类型,服务器会在调用init()方法时传递ServletConfig对象给init()方法.   ServletConfig对象封装 ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示 ...