5.python设计模式【单例模式】

  • 内容:保证一个类只有一个实例,并提供一个访问它的全局访问点
  • 角色:
    • 单例(Singleton)
  • UML图
  • 举个例子:
    需求:一个类只能实例化一个对象,不能实例化多个对象
python 复制代码
from abc import abstractmethod,ABCMeta
'''
__new__:
在基础类object中,__new__被定义成了一个静态方法,并且需要传递一个参数cls。Cls表示需要实例化的类,此参数在实例化时由Python解析器自动提供。
new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,
在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,
new()决定是否要使用该init()方法,
因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。

hasattr(cls,"_instance"):
判断这个类是否已经实例化

'''


class Singleton:
   def __new__(cls, *args, **kwargs):
       # 如果没有实例化,就实例化
       if not hasattr(cls,"_instance"):
           cls._instance=super(Singleton,cls).__new__(cls)
       return cls._instance

class MyClass(Singleton):
   def __init__(self,a):
       self.a=a

a=MyClass(10)
b=MyClass(20)

print(a.a)
print(b.a)
print(id(a),id(b))

输出结果

20

20

139718467807696 139718467807696

说明是同一个对象

  • 优点:
    • 对唯一实例的受控访问
    • 单例相当于全局变量,但访问了命名空间被污染
相关推荐
曲幽6 小时前
FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好
python·fastapi·web·jwt·oauth2·user·authentication
装不满的克莱因瓶6 小时前
掌握 RNN 与 LSTM 模型结构
人工智能·python·rnn·深度学习·神经网络·ai·lstm
何以解忧,唯有..7 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
金銀銅鐵7 小时前
用 Tkinter 实现简单的猜数字游戏
后端·python
copyer_xyf7 小时前
Python 模块与包的导入导出
前端·后端·python
小bo波7 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
ice8130331818 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
copyer_xyf8 小时前
Python venv 虚拟环境
前端·后端·python
林爷万福9 小时前
GitHub 开源光谱数据处理项目推荐
python·光纤光谱仪
copyer_xyf9 小时前
Python 如何同时做很多事:进程、线程、协程
前端·后端·python