定义装饰器中的使用次数(带有装饰器的单一图案)

时间:2019-02-15 22:35:57

标签: python

我正在尝试使用装饰器来实现Singleton设计模式。使用元类可以很容易地实现它,但是我面临的问题是一个类可以具有多个模式。

例如,一个类可以是观察者,也可以是单身人士。我的装饰器看起来像这样:

def Singleton(_cls):
    _instances = {}

    def wrapper(*args, **kwargs):
        if _cls not in _instances:
            _instances[_cls] = object.__new__(_cls)
            _instances[_cls].__dict__.update(kwargs)
        else:
            raise AlreadyDefinedError(
                "A Singleton instance has been defined already. "
                "You can't have more than 1 Singleton object."
            )

        return _instances[_cls]

    return wrapper

问题在于,由于Singleton是一个函数,因此此代码不起作用。每次装饰新类时,我的_instances dict都会重新定义,并且为空。有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您尚未在字典中更新*args

有很多方法可以做一个单例装饰器。这是一种函数属性方法。

import functools as ft

def singleton(cls):
    @ft.wraps(cls)
    def wrapper(*args, **kwargs):
        if wrapper.instance is None:
            wrapper.instance = cls(*args, **kwargs)
        return wrapper.instance
    wrapper.instance = None
    return wrapper