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()
来源:oschina
链接:https://my.oschina.net/tplinuxhyh/blog/3210318