单例模式
单例模式
单例模式:指的是在确定 “类中的属性与方法” 不变时,需要反复调用该类,产生2不同的对象,而产生的对象会有不同的内存地址,会造成资源浪费,所有让所有的类实例化时都指向同一个内存空间,称为单例模式
优点:节省内存空间
单例模式有五种方法实现:
- 通过classmethod
- 通过__ new__来实现
- 通过装饰器实现
- 通过导入模块实现
- 通过元类实现
1、通过classmethod
# 通过classmethod
class MySQL:
# 一个默认值,用于判断对象是否存在, 对象不存在证明值是None
# __instance是类的属性,可以由类来调用
__instance = None # ---》 执行到代码obj = cls(host, port) ---》 obj
# __instance = obj
def __init__(self, host, port):
self.host = host
self.port = port
@classmethod
def singleton(cls, host, port): # 单例方法 ---》 类方法
# 判断__instance中若没有值,证明没有对象
if not cls.__instance:
# 产生一个对象并返回
obj = cls(host, port)
# None ---> obj
cls.__instance = obj
# 若__instance中有值,证明对象已经存在,则直接返回该对象
return cls.__instance
def start_mysql(self):
print('启动mysql')
def close(self):
print('关闭mysql')
obj1 = MySQL.singleton('180.101.49.12', 443)
print(obj1) # <__main__.MySQL object at 0x00000207EFC09188>
obj2 = MySQL.singleton('180.101.49.12', 443)
print(obj2) # <__main__.MySQL object at 0x00000207EFC09188>
2、通过__ new__来实现
class MySQL:
__data = None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not cls.__data:
cls.__data = object.__new__(cls)
return cls.__data
obj1 = MySQL()
obj2 = MySQL()
print(obj1)
print(obj2)
3、通过装饰器实现
类可以作为字典中的key
def mysql(cls):
_date = {}
def inner(*args, **kwargs):
if cls not in _date:
obj = cls(*args, **kwargs)
_date[cls] = obj
return _date[cls]
return inner
@mysql
class Foo:
def __init__(self):
pass
obj1 = Foo()
obj2 = Foo()
print(obj1) # <__main__.Foo object at 0x000002041ACBA448>
print(obj2) # <__main__.Foo object at 0x000002041ACBA448>
4、通过导入模块实现
#mysql模块
class MySql:
def __init__(self):
pass
obj = MySql()
from mysql import obj
print(obj) # <mysql.MySql object at 0x000001FE6378CF48>
# from mysql import obj
print(obj) # <mysql.MySql object at 0x000001FE6378CF48>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!