一日一技:Python 下面最简单的单例模式写法

简介: 一日一技:Python 下面最简单的单例模式写法

摄影:产品经理买单:kingname

二十几种设计模式中,单例模式是最简单最常用的一种。在其他语言里面实现单例模式要写不少代码,但是在 Python 里面,有一种非常简单的单例模式写法。

为了演示这种简单的写法,我们首先创建一个文件,DBUtil.py文件,用来模拟数据库操作类。这个文件里面的代码如下:

class DBUtil:
    def __init__(self):
        self.conn = self.connect()
    def connect(self):
        print('创建数据库连接')
        return'connect'
    def write(self, data):
        print(f'写入数据:{data}')
    def read(self):
        print('从数据库中读取数据')
        return123

现在我们创建两个文件:a.pyb.py,用来模拟在一个工程里面的两个不同地方同时调用数据库操作类并初始化的过程。

a.py内容如下:

from DBUtil import DBUtil
from b import run
data = run()
db_util = DBUtil()
db_util.write(data)

b.py的内容如下:

from DBUtil import DBUtil
def run():
    db_util = DBUtil()
    data = db_util.read()
    return data

运行效果如下图所示:

可以看到,创建数据库连接被打印了两次,说明DBUtil类被实例化了两次。对应到真实的项目中,就是创建了多个到数据库的链接。这样是很浪费资源的。

当然,你可以在 a.py中初始化DBUtil,然后把这个对象作为参数传入run函数里面,再run函数里面调用这个对象的read()方法。

但是在实际项目中,往往会出现很多层的调用,如果要把一个对象一层一层传下去,不仅让参数列表显得杂乱,还容易漏掉或者搞错顺序。

所以,使用单例模式就能避免通过参数传递对象,但又不会创建多个数据库连接。

网上关于单例模式的代码有很多。本文将会介绍最简单的一种,利用 Python 的import机制。在 Python 里面,一个模块只会被导入1次,如果多次使用import xxx导入同一个模块,后面的导入语句会被自动忽略。利用这个机制,我们就能很容易实现单例模式。

修改DBUtil.py,在它的最下面加上一行代码:

class DBUtil:
    def __init__(self):
        self.conn = self.connect()
    def connect(self):
        print('创建数据库连接')
        return'connect'
    def write(self, data):
        print(f'写入数据:{data}')
    def read(self):
        print('从数据库中读取数据')
        return123
db_util = DBUtil()

修改a.py:

from DBUtil import db_util
from b import run
data = run()
db_util.write(data)

修改b.py:

from DBUtil import db_util
def run():
    data = db_util.read()
    return data

运行以后的效果如下图所示:

可以看到,创建数据库连接只打印了1次,说明单例模式成功。

这种单例模式非常简单,但是有一个弊端,就是无法实现懒加载。程序刚刚开始运行,DBUtil类就会被实例化,无法做到等到需要的时候才实例化。


目录
相关文章
|
8月前
|
Python
如何在Python中实现单例模式?
【1月更文挑战第15天】
54 2
|
3月前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
4月前
|
设计模式 缓存 数据库
Python中的单例模式
单例模式确保一个类只有一个实例,并提供全局访问点。此模式常用于共享资源或限制资源访问,可避免资源浪费并简化全局访问。其实现方法包括使用模块级变量、装饰器或元类。尽管单例模式能简化访问和初始化,但也可能引入全局状态,影响代码的可维护性。适用于配置管理、数据库连接池等场景。
|
5月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
65 0
|
7月前
|
设计模式 测试技术 数据库
Python单例模式详解与实际应用
单例模式是一种特殊的设计模式,它通过限制一个类的实例数量为一个来保证只有一个实例被创建,并且提供一个全局访问点以供其他对象使用。
96 3
|
6月前
|
设计模式 缓存 数据库
Python中的单例模式是什么?
**摘要:** 单例模式是一种设计模式,确保类只有一个实例并提供全局访问点。常用于共享资源、配置管理、数据库连接池、日志记录和缓存。Python中可使用模块级变量、装饰器或元类实现单例。需谨慎使用,以避免全局状态导致的复杂性。
|
8月前
|
存储 安全 Python
如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
【2月更文挑战第5天】【2月更文挑战第11篇】如何在Python中实现一个单例模式,确保在多线程环境中也是安全的?
240 1
|
8月前
|
存储 安全 Python
|
Python
62 python - 单例模式
62 python - 单例模式
37 0
|
缓存 安全 开发者
Python 单例模式讲解和代码示例
Python 单例模式讲解和代码示例
58 0