前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:Python 下面最简单的单例模式写法

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

作者头像
青南
发布2019-11-14 15:26:33
1K0
发布2019-11-14 15:26:33
举报
文章被收录于专栏:未闻Code
摄影:产品经理

买单:kingname

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

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

代码语言:javascript
复制
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('从数据库中读取数据')
        return 123

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

a.py内容如下:

代码语言:javascript
复制
from DBUtil import DBUtil
from b import run

data = run()
db_util = DBUtil()
db_util.write(data)

b.py的内容如下:

代码语言:javascript
复制
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,在它的最下面加上一行代码:

代码语言:javascript
复制
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('从数据库中读取数据')
        return 123

db_util = DBUtil()

修改a.py:

代码语言:javascript
复制
from DBUtil import db_util
from b import run

data = run()
db_util.write(data)

修改b.py:

代码语言:javascript
复制
from DBUtil import db_util

def run():
    data = db_util.read()
    return data

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档