python单例装饰_python: 单例装饰器

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值