编程学习网 > 编程语言 > Python > 简单又实用!教你如何用装饰器实现 Python 单例!
2024
10-15

简单又实用!教你如何用装饰器实现 Python 单例!


在 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教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取