百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 设计模式——单例模式(编写单例模式)

off999 2024-10-27 11:57 45 浏览 0 评论

单例模式即确保类有且只有一个特定类型的对象,并提供全局访问点。因此通常用于日志记录、数据库操作、打印机后台处理程序等。这些程序在运行过程中只生成一个实例,避免对同一资源产生相互冲突的请求。

特点:

  • 确保类有且只有一个对象被创建
  • 为唯一对象提供访问点,令其可被全局访问
  • 控制共享资源的并行访问

经典单例模式

class Singleton(object):
    def __new__(cls, name):
        if not hasattr(cls, 'instance'):
            cls.instance = super().__new__(cls)
        return cls.instance

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


s1 = Singleton('Singleton1')
print(s1)
# => <__main__.Singleton object at 0x7efc1b006220>
print(s1.name)
# => Singleton1

s2 = Singleton('Singleton2')
print(s2)
# => <__main__.Singleton object at 0x7efc1b006220>
print(s2.name)
# => Singleton2
print(s1.name)
# => Singleton2

在上面的代码中,通过定义 __new__ 方法控制对象的创建。方法 hasattr 则用于检查对象 cls 是否具有 instance 属性(即确认该类是否已经生成了一个对象)。若 instance 属性不存在,则使用 super().__new__() 方法创建新的实例;若 instance 属性存在,则分配已有的实例给变量。

因此当 s2 = Singleton('Singleton2') 执行时,hasattr 发现对象实例已存在(s1),因此直接将已有的对象分配给 s2。s1 和 s2 实际是同一个对象实例。

Monostate(单态)模式

Monostate 模式即类的所有实例对象共享相同的状态。

class Borg:
    __shared_state = {}
    def __init__(self):
        self.__dict__ = self.__shared_state

b = Borg()
b1 = Borg()

print(b is b1)  # => False
b.x = 4
print(b.x)      # => 4
print(b1.x)     # => 4
b1.x = 6
print(b1.x)     # => 6
print(b.x)      # => 6

在上述代码中,通过将类变量 __shared_state 赋值给实例变量 __dict__ ( __dict__ 变量用于存储实例对象的属性等状态),使得类生成的所有对象实例都共享同一状态。

即 b 和 b1 是 Borg 类创建的不同的实例对象,但用于保存实例状态的 b.__dict__ 和 b1.__dict__ 却是相同的(即都是 Borg.__shared_state )。因此 b 的属性 x 若发生改变,同样的变化也会体现到 b1 中。

也可以通过修改 __new__ 方法来实现 Borg 模式:

class Borg:
    __shared_state = {}
    def __new__(cls, name):
        obj = super().__new__(cls)
        obj.__dict__ = cls.__shared_state
        return obj

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


b1 = Borg('Borg1')
print(b1.name)   # => Borg1
b2 = Borg('Borg2')
print(b2.name)   # => Borg2
print(b1.name)   # => Borg2
b1.name = 'Borg'
print(b1.name)   # => Borg
print(b2.name)   # => Borg
print(b1 is b2)  # => False

通过元类实现单例模式

class MetaSingleton(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None

    def __call__(self, *args, **kwargs):
        if not self.__instance:
            self.__instance = super().__call__(*args, **kwargs)
        return self.__instance


class Logger(metaclass=MetaSingleton):
    pass


logger1 = Logger()
logger2 = Logger()
print(logger1, logger2)
# => <__main__.Logger object at 0x7fac8af577c0> <__main__.Logger object at
# 0x7fac8af577c0>
print(logger1 is logger2)  # => True

单例模式的实际应用

DB 操作

import sqlite3

class MetaSingleton(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None

    def __call__(self, *args, **kwargs):
        if not self.__instance:
            self.__instance = super().__call__(*args, **kwargs)
        return self.__instance


class Database(metaclass=MetaSingleton):
    connection = None
    def connect(self):
        if self.connection is None:
            self.connection = sqlite3.connect("db.sqlite3")
            self.cursorobj = self.connection.cursor()
        return self.cursorobj


db1 = Database().connect()
db2 = Database().connect()

print(db1, db2)
# => <sqlite3.Cursor object at 0x7f810d6f8260> <sqlite3.Cursor object at
# 0x7f810d6f8260>
print(db1 is db2)
# => True

监控服务

class HealthCheck:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not HealthCheck._instance:
            HealthCheck._instance = super().__new__(cls, *args, **kwargs)
        return HealthCheck._instance

    def __init__(self):
        self._servers = []

    def addServer(self):
        self._servers.append("Server 1")
        self._servers.append("Server 2")
        self._servers.append("Server 3")
        self._servers.append("Server 4")

    def changeServer(self):
        self._servers.pop()
        self._servers.append("Server 5")

hc1 = HealthCheck()
hc2 = HealthCheck()

hc1.addServer()
print("Schedule health check for servers (1) ...")
for i in range(4):
    print("Checking ", hc1._servers[i])

hc2.changeServer()
print("Schedule health check for servers (2) ...")
for i in range(4):
    print("Checking ", hc2._servers[i])

# => Schedule health check for servers (1) ...
# => Checking  Server 1
# => Checking  Server 2
# => Checking  Server 3
# => Checking  Server 4
# => Schedule health check for servers (2) ...
# => Checking  Server 1
# => Checking  Server 2
# => Checking  Server 3
# => Checking  Server 5

私信小编01即可获取大量Python学习资料

相关推荐

windows7安装版系统下载(win7安装版安装步骤)

1、win7系统装完后需要占用C盘空间10-15GB,如果把常用软件也安装到C盘,大小超过20+。  2、在分区的时候根据硬盘大小,如果硬盘相对较小,一般建议设置50G,最低不能低于30G。因...

韩剧网(韩剧网韩剧tv最新韩剧免费观看)

不收费,终身不收费~连续剧、综艺、歌曲,通通不要钱。之前好像是技术问题,现在恢复了。其它诸如人人视频、圈粉TV也都可以看韩剧哦。韩剧网有搜索页面的呀,搜索一下就可以了,不过好像《制作人》和玄彬的...

跳一跳游戏(跳一跳游戏是什么时候出来的)

GiveItUP《GiveItUP》是一款由Invictus推出的益智跑酷游戏。游戏与传统的跑酷类游戏最大的区别在于,游戏融入了高难度的节奏性挑战。红色火焰躲避技巧:红色火焰在游戏中是最常见的一个障碍...

什么是oa办公系统(办公oa系统的好处)

OA是OfficeAutomation的简写,就是办公自动化。所谓OA系统就是用网络和OA软件构建的一个单位内部的办公通信平台,用于辅助办公。OA系统完成单位内部的邮件通信、信息发布、文档管理、工作...

手机万能mp4转换器(手机万能mp4转换器下载)

1你需要先下载并安装一个叫格式工厂的软件。2然后打开->mp4。3点击添加文件的选项。4然后选择需要转换的视频,点击确定。5点击确定之后,再添加到转换列表中就可以。6再点...

迅雷beta官网(迅雷beta官方网)

若手机不能安装软件/游戏,建议:1.检查“未知来源”设置是否开启。2.查看下载的软件格式是否为机器所支持的。安卓系统手机支持的软件格式为.APK格式。3.下载软件时请阅读软件详情,查看是否对机器操作系...

私人家庭影院hd免费版游戏评测

《海上钢琴师》是由朱塞佩·托纳托雷执导,蒂姆·罗斯、比尔·努恩、梅兰尼·蒂埃里主演的剧情、音乐、爱情片。该片讲述了一个被命名为“1900”的弃婴在一艘远洋客轮上与钢琴结缘,成为钢琴大师的传奇故事。该片...

题库网(题库网站有哪些)

学科网的试卷有续费的和不需要交费的两类试卷,如果你是学科网的用户,可以下载试卷,还可以组卷,对于我们一线的老师来讲,这很方便的,只要学校肯出钱,在学科网前,全校的老师就可以注册免费试用学科,网上所有的...

类似迅雷的下载器有哪些(手机下载工具app)

推荐闪电下载和黑科技下载这两款APP手机上取代迅雷的下载器有闪电下载APP和黑科下载器APP等,以这两款为例,它们都是可以支持ed2k、磁力链等下载方式,也能够支持多种不同类似的文件的高速下载。、BT...

qq号申请免费注册官网(qq注册账号免费申请网址)

你好,通用的申请QQ号码的方法如下:1、首先打开腾讯官网。2、在腾讯页面左边的通信工具里面点击号码。3、点击号码以后就会进入QQ注册页面。4、进入QQ注册页面以后,在昵称后面输入要注册号码的名字。5、...

安卓安装windows(安卓安装apk解析包出错)

oppo手机支持安卓和Windows操作系统,但是双系统安装需要手机支持虚拟化技术(VT)。如果手机支持VT,可以在电脑上安装虚拟化软件,然后在手机上运行VT兼容的虚拟化应用程序,从而实现在电脑上安装...

安全中心下载(网易安全中心下载)

可以通过解除保护模式页面,查看QQ帐号进入保护模式的原因,及获取恢复QQ帐号正常使用的方法。点击小i,然后把自动登录选项去掉,打开safari,随便点一个网页,去登录。畅游经常这样抽风,可以关了游戏...

重装系统步骤(USB重装系统步骤)

正版的win10及以上系统,现在已经都自带系统重置功能,可以一键重置恢复到出厂设置。1.按住win+i,在弹出的windows设置对话框中,点击更新和安全选项,在弹出的设置对话框中,点击左侧的恢复选项...

qq群发软件手机版免费(qq群发软件安卓版免费下载)

分享一个可以免费试用的软件,“www.liaotiangou.com”在做微信营销的时候经常会需要使用到群发功能,出了多群群发之外,还有定时群发,甚至是定时发送朋友圈。多群群发可以解决以前最多只能群发...

小说排行榜2020前十名(耿美小说排行榜2020前十名)

1、元龙《元龙》是目前2020年哔哩哔哩国创动漫热门榜的第一名,讲述的是一名来自现代的王牌狙击手,穿越到了玄幻的元魂世界,从此展开的一系列热血的战斗与机遇,成为元魂世界的霸者的故事。2、灵笼《灵笼》是...

取消回复欢迎 发表评论: