翼度科技»论坛 编程开发 python 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
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单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/319186z7v.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具