Coding 【每日一题】实现一个单例模式-Python-20210828

Jack · 2021年08月28日 · 最后由 Jack 回复于 2021年08月29日 · 28 次阅读
本帖已被设为精华帖!

实现一个单例模式。

Jack 将本帖设为了精华贴 08月28日 20:38

参考代码:

# 用装饰实现
def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return wrapper


@singleton
class Foo(object):
    pass
foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)

# 用基类实现
class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

class Foo(Singleton):
    pass
foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)

# 使用元类实现
class Singleton(type):
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance

# Python2
class Foo(object):
    __metaclass__ = Singleton
# Python3
class Foo(metaclass=Singleton):
    pass

foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册