IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python与设计模式–单例模式 -> 正文阅读

[Python知识库]Python与设计模式–单例模式

**

Python与设计模式–单例模式**

**

一、单例模式概述
保证一个类仅有一个实例,并提供一个访问它的全局访问点。

二、在Python中实现单例模式

方法一: 重写__new__方法

class Singleton1(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            # Python2类继承
            # cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
            cls._instance = super().__new__(cls, *args, **kwargs)

        return cls._instance

__new__和__init__的区别:

  • __new__是object基类提供的内置的静态方方法,主要作用:
    1.在内存中为对象分配空间
    2.返回对象的引用

  • __init__是当实例对象创建完成后被调用的,设置对象属性的一些初始值,通常用在初始化一个类实例的时候,是实例方法。

方法二:使用metaclass(元类) Pyhon的高级用法

class Singleton2(type):
    def __init__(self, name, bases, dict):
        super().__init__(name, bases, dict)
        self._instance = None

    def __call__(self, *args, **kwargs):
        if self._instance is None:
            self._instance = super().__call__(*args, **kwargs)
        return self._instance

关于元类可以这样理解
python中的一切都是对象,这些对象要么是类对象的实例, 要么是元类的实例, 除了type, 元类是比较复杂的, 大多数情况下, 我们不会对类做修改。 如果需要对类做修改, 大多数情况下我们会通过:

  1. Monkey patching
  2. class decorators

方法三:使用装饰器(decorator),这是一种更加Pythonic的方法

def singleton(cls):
    instance = {}

    @functools.wraps(cls)
    def _singleton(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return _singleton

这里的装饰器与GoF设计模式书中的使用不一致,装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树。
在Python中,装饰器函数相当于Decorator的具体子类,而装饰器返回的内部函数相当于装饰器实例。

方法四:文件导入 :import方法 作为python的模块是天然的单例模式

class Singleton4(object):
    pass


my_singleton = Singleton4()

三、具体的例子

# -*- coding: utf-8 -*-
"""
@Time    : 2022/1/27 15:37
@Author  : ghzhou
@FileName: singleton_pattern2.py
@Software: PyCharm
"""
import threading
import time

from singleton_pattern import Singleton, singleton1, Singleton2


# VisitEntity Bus

class Bus(metaclass=Singleton2):
    lock = threading.RLock()

    def send_data(self, data):
        self.lock.acquire()
        time.sleep(3)
        print('Sending signal Data...', data)
        self.lock.release()
        print(id(self))


class VisitEntity(threading.Thread):
    my_bus = ""
    name = ""

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

    def run(self):
        self.my_bus = Bus()
        self.my_bus.send_data(self.name)


if __name__ == '__main__':
    t0 = time.time()
    for i in range(3):
        print('Entity %d begin to run..' % i)
        my_entity = VisitEntity()
        my_entity.set_name('Entity_' + str(i))
        my_entity.start()

运行结果如下:
Entity 0 begin to run…
Entity 1 begin to run…
Entity 2 begin to run…
Sending signal Data… Entity_0
2345367976536
Sending signal Data… Entity_1
2345367976536
Sending signal Data… Entity_2
2345367976536
在程序运行过程中,三个线程同时运行(运行结果的前三行先很快打印出来),而后分别占用总线资源(后三行每隔3秒打印一行)。虽然看上去总线Bus被实例化了三次,但实际上在内存里只有一个实例。

四、单例模式的优缺点
单例模式的优点:
1、可以节省比较多的内存空间;
2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用;
3、单例可长驻内存,减少系统开销。
缺点:
1、 单例模式没有抽象层,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
2、单例类的职责过重,在一定程度上违背了“单一职责原则“;
3、滥用单例将带来一些负面问题,如:为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 18:53:50  更:2022-01-30 18:53:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:56:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码