python: 单例装饰器

给你一囗甜甜゛ 提交于 2020-03-24 18:43:56

3 月,跳不动了?>>>

singleton 的三种写法

#
# instance_map = {}
#
#
# def get_instance(cls, *args, **kwargs):
#     if cls not in instance_map:
#         instance_map[cls] = cls(*args, **kwargs)
#     # log
#     instance = instance_map[cls]
#     print(f'id:{id(instance)}')
#     return instance
#
#
# def singleton(cls):
#     def on_call(*args, **kwargs):
#         return get_instance(cls, *args, **kwargs)
#     return on_call


def singleton(cls):
    instance = None

    def wrapper(*args, **kwargs):
        nonlocal instance
        if instance:
            return instance
        instance = cls(*args, **kwargs)
        print(f"id:{id(instance)}")
        return instance
    return wrapper


class Singleton(object):
    def __init__(self, cls):
        self.cls = cls
        self.cls_instance = None

    def __call__(self, *args, **kwargs):
        if self.cls_instance:
            return self.cls_instance
        self.cls_instance = self.cls(*args, **kwargs)
        print(f"id:{id(self.cls_instance)}")
        return self.cls_instance

test.py

@Singleton
# @singleton
class Spam(object):
    def __init__(self, val=None):
        self.val = val


@Singleton
# @singleton
class Person(object):
    def __init__(self, name, age=0):
        self.name = name
        self.age = age
		

def main():
    # spam(1, 2, 3)
    # spam(1, 2, 3)
    # spam(1, 2, 3)
    #
    # list_comp(3)
    # list_comp(5)

    bob = Person('abc', age=10)
    tom = Person('abc', age=10)
    assert bob.name == tom.name, "singleton err"
    assert bob.age == tom.age, "singleton err"
    assert id(bob) == id(tom), "singleton err"

    x = Spam(val=10)
    y = Spam(val=20)
    assert x.val == y.val, "singleton err"
    assert id(x) == id(y), "singleton err"


if __name__ == '__main__':
    main()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!