Python装饰器实现单例

Python装饰器实现单例

单例目的在于创建对象时总是产生同一个对象,并不会创建新的。利用装饰器,可以在类本身不改变的前提下,将此类改为单例模式。

利用nonlocal实现单例

def Singleton(cls):
    _instance = None

    def _singleton(*args, **kargs):
        nonlocal _instance
        if _instance is None:
            _instance = cls(*args, **kargs)
        return _instance

    return _singleton


@Singleton
class A:
    pass


for i in range(3):
    a = A()
    print(a)

输出:

<__main__.A object at 0x000001A47CBC0BE0>
<__main__.A object at 0x000001A47CBC0BE0>
<__main__.A object at 0x000001A47CBC0BE0>

nonlocal是python3.0才可使用。

nonlocal实现单例

def Singleton(cls):
    _instance = {}

    def _singleton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]

    return _singleton


@Singleton
class A:
    pass


for i in range(3):
    a = A()
    print(a)

输出:

<__main__.A object at 0x000001434A3B9198>
<__main__.A object at 0x000001434A3B9198>
<__main__.A object at 0x000001434A3B9198>

其实nonlocal解决了内嵌函数的作用域问题,内嵌函数无法修改上层函数的变量,nonlocal意味着它们位于一个嵌套的函数中。

初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

你可能感兴趣的:(Python装饰器实现单例)