设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 112|回复: 14

Python的四种单例模式实现方式

[复制链接]

6

主题

45

回帖

222

积分

中级会员

积分
222
发表于 2024-4-20 09:46:21 | 显示全部楼层 |阅读模式
目录


★ 单例模式基本介绍

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问点,以便在需要时获取该实例。

★ 实现单例的几种方式:


  • 模块导入
  • 添加装饰器(类装饰器和函数装饰器)
  • 重写new方法
  • 元类继承

★ 方式一: 模块导入


文件结构
  1. 单例
  2. ├───file1.py
  3. ├───file2.py
  4. ├───readme
  5. ├───单例实现1_模块导入.py
  6. └───模块导入实现单例测试.py
复制代码
单例实现1_模块导入.py
  1. """
  2. 模块导入实现单例模式步骤:
  3. 1. 在模块中定义类
  4. 2. 实例化类并返回
  5. 3. 在其他文件中导入实例对象使用, 每个文件导入的对象实际是同一个
  6. """
  7. class Singleton:
  8.     def __init__(self, name):
  9.         self.name = name
  10.     def do_something(self):
  11.         pass
  12. singleton = Singleton('模块单例')
  13. # 在其他py文件中
  14. # from my_singleton import singleton
复制代码
file1.py
  1. from 单例实现1_模块导入 import singleton
  2. print(singleton)
复制代码
file2.py
  1. from 单例实现1_模块导入 import singleton
  2. print(singleton)
复制代码
模块导入实现单例测试.py
  1. import file1
  2. import file2
  3. print(file1.singleton is file2.singleton)
复制代码



执行结果
  1. <单例实现1_模块导入.Singleton object at 0x0000021B2B81F400><单例实现1_模块导入.Singleton object at 0x0000021B2B81F400>True
复制代码
★ 方式二: 装饰器


单例实现2_装饰器.py
  1. # -------------------函数装饰器---------------------------
  2. def Singleton1(cls):
  3.     instance = {}
  4.     def _singleton_wrapper(*args, **kargs):
  5.         if cls not in instance:
  6.             instance[cls] = cls(*args, **kargs)
  7.         return instance[cls]
  8.     return _singleton_wrapper
  9. # -------------------类装饰器---------------------------
  10. class Singleton2:
  11.     def __init__(self, cls):
  12.         self.cls = cls
  13.         self._instance = None
  14.     def __call__(self, *args, **kwargs):
  15.         if not self._instance:
  16.             self._instance = self.cls(*args, **kwargs)
  17.         return self._instance
  18. # SingletonTest = Singleton1(SingletonTest) =_singleton_wrapper
  19. # SingletonTest = Singleton2(SingletonTest) = Singleton2实例对象
  20. @Singleton1
  21. class SingletonTest(object):
  22.     def __init__(self, name):
  23.         print(">>> 初始化 <<<")
  24.         self.name = name
  25. s1 = SingletonTest('s1')
  26. s2 = SingletonTest('s2')
  27. print(s1, s2)
  28. print(s1 is s2)
复制代码
执行结果
  1. >>> 初始化 <<<<__main__.SingletonTest object at 0x000001E6A2FF73D0> <__main__.SingletonTest object at 0x000001E6A2FF73D0>True
复制代码
★ 方式三: 重写new方法


单例实现3_重写new方法.py
  1. class Singleton(object):
  2.     def __new__(cls, *args, **kwargs):
  3.         if not hasattr(Singleton, "_instance"):
  4.             Singleton._init_flag = True
  5.             Singleton._instance = super().__new__(cls)
  6.         return Singleton._instance
  7.     def __init__(self, name):
  8.         if not hasattr(Singleton, "_init"):
  9.             Singleton._init = True
  10.             print(">>> 初始化 <<<")
  11.             self.name = name
  12. s1 = Singleton('s1')
  13. s2 = Singleton('s2')
  14. print(s1, s2)
  15. print(s1 is s2)
复制代码
执行结果
  1. >>> 初始化 <<<<__main__.Singleton object at 0x0000016663140760> <__main__.Singleton object at 0x0000016663140760>True
复制代码
★ 方式四: 元类继承


单例实现4_元类继承.py
  1. class Singleton(type):
  2.     def __call__(cls, *args, **kwargs):
  3.         if not hasattr(Singleton, "_instance"):
  4.             # cls 是 Singleton 创建的类
  5.             Singleton._instance = cls.__new__(cls, *args, **kwargs)
  6.             cls.__init__(Singleton._instance, *args, **kwargs)
  7.         return Singleton._instance
  8. class SingletonTest(metaclass=Singleton):
  9.     pass
  10. class A(SingletonTest):
  11.     def __init__(self, name):
  12.         print(">>> 初始化 <<<")
  13.         self.name = name
  14. s1 = A('s1')
  15. s2 = A('s2')
  16. print(s1, s2)
  17. print(s1 is s2)
复制代码
执行结果
  1. >>> 初始化 <<<<__main__.A object at 0x000001687C79D5E0> <__main__.A object at 0x000001687C79D5E0>True
复制代码
到此这篇关于Python的四种单例模式实现方式的文章就介绍到这了,更多相关Python单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

0

主题

52

回帖

104

积分

注册会员

积分
104
发表于 2024-5-1 19:53:11 | 显示全部楼层
666666666666

1

主题

52

回帖

128

积分

注册会员

积分
128
发表于 2024-5-19 15:54:58 | 显示全部楼层
谢谢你的提醒,我会注意的。

1

主题

44

回帖

112

积分

注册会员

积分
112
发表于 2024-6-19 11:36:08 | 显示全部楼层
我完全同意你的观点

2

主题

32

回帖

108

积分

注册会员

积分
108
发表于 2024-6-26 23:42:44 | 显示全部楼层
我想了解更多

1

主题

54

回帖

132

积分

注册会员

积分
132
发表于 2024-7-2 03:00:19 | 显示全部楼层
谢谢你的提醒,我会注意的。

1

主题

49

回帖

120

积分

注册会员

积分
120
发表于 2024-7-20 04:48:27 | 显示全部楼层
确实牛逼

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-8-3 23:46:59 | 显示全部楼层
好用好用

0

主题

49

回帖

97

积分

注册会员

积分
97
发表于 2024-8-21 09:10:42 | 显示全部楼层
让我们一起努力

0

主题

49

回帖

99

积分

注册会员

积分
99
发表于 2024-8-29 19:08:48 | 显示全部楼层
牛逼
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 10:41 , Processed in 0.113174 second(s), 26 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表