在 Python 中,单例是一种设计模式,可确保类只有一个实例,并提供全局 访问该实例, 这在管理共享资源(如数据库连接)时非常有用, 配置对象或日志记录系统,其中多个实例化会导致效率低下或不一致。在这篇博文中,我们将讨论使用装饰器的单例模式的 Python 实现,我们将逐步介绍 代码并解释它是如何工作的,重点介绍类和 Decorator 函数。
什么是 Decorator?
Python 中的装饰器是修改或扩展另一个函数或类的行为的函数,它允许 你 来“包装”一个函数或类,在不改变其结构的情况下为其添加功能。
单例模式解释
单例模式保证一个类只有一个实例,请求单例实例时, 返回现有实例,而不是创建新实例,这对于某些人来说尤其重要, 需要在整个程序中共享的应用程序级服务。
代码分解
让我们分解代码,看看它如何强制执行单例行为。
1. The Class_SingletonWrapper
class _SingletonWrapper: """ A singleton wrapper class. Its instances would be created for each decorated class. """def __init__(self, cls): self.__wrapped__ = cls self._instance = None该类充当正在修饰的原始类的包装器。该方法采用一个类 () 并将其存储在wrapped属性中。
它还初始化为instance为None。
2. 方法__call__
def __call__(self, *args, **kwargs): """Returns a single instance of decorated class""" if self._instance is None: self._instance = self.__wrapped__(*args, **kwargs) return self._instance
该方法是 Python 中的一种特殊方法,它使类的实例可调用,它是在 instance 的调用方式与函数类似,在这种情况下,当调用单例对象时,它会检查实例是否已经 存在__call__如果是(即尚未创建实例),则创建装饰类的新实例。_instanceNone
如果实例已存在,则返回相同的实例,确保该类只有一个实例 创建。3. 装饰器singleton
def singleton(cls): """ A singleton decorator. Returns a wrapper object. A call on that object returns a single instance object of decorated class. Use the __wrapped__ attribute to access the decorated class directly in unit tests. """ return _SingletonWrapper(cls)
此函数充当实际的装饰器,当一个类用 装饰时,它会将包装类的实例,现在,每当实例化修饰的类时,包装的版本将返回一个 单个实例。
@singleton_SingletonWrapper使用单例装饰器
让我们看一个如何使用这个装饰器的示例。@singletonclass Logger: def __init__(self): self.log = []
def write_log(self, message): self.log.append(message)
def read_log(self): return self.log
在这种情况下,类使用 decorator 进行修饰,现在,无论你尝试多少次 实例化,你将始终获得相同的实例:
logger1 = Logger()logger2 = Logger()logger1.write_log("Log message 1")print(logger2.read_log()) # Output: ['Log message 1']
print(logger1 is logger2) # Output: True
如上所示,both 和 引用同一个实例,演示了单例行为。
使用单例的优点
全局访问:单例允许集中控制和管理整个实例 应用,当拥有共享资源(如数据库连接或日志记录服务)时,这非常有用。效率:由于重用了同一个实例,因此单例模式可以减少内存使用并加快对象速度 访问权限,尤其是对于资源密集型对象。
易于测试:使用 attribute,可以直接访问 单元测试,这允许独立于单例行为测试类,从而使代码更易于测试 并维护。
何时避免使用单例
虽然单例模式可能很有用,但它并不总是适合所有情况,过度使用单例可以 导致紧密耦合,使代码难以测试和维护,它们还引入了全局状态,这可能会导致在多线程环境中或扩展应用程序时出现问题。
结论
如果应用得当,单例模式是一个强大的工具。使用我们在这里探讨的装饰器 允许您在实施单例行为的同时创建干净、可重用的代码,与任何设计模式一样,它很重要了解它最有益的环境并明智地应用它。以上就是“简单又实用!教你如何用装饰器实现 Python 单例!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/12524/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料