python单例模式的三种实现方式

  • __new__特殊方法实现
class Singleton:

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, name):
        self.name = name

s1 = Singleton('first')
s2= Singleton('last')
print(s1 == s2)
>> True
print(s1.name)
>> last

tips: __new__方法无法避免触发init(),初始的成员变量会进行覆盖

  • 装饰器实现
def singleton(cls):
    _instance = {}
    def inner(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return inner

@singleton
class Test:
    def __init__(self, name):
        self.name = name

t1 = Test('first')
t2 = Test('last')
print(t1==t2)
>> True
print(t2.name)
>> first

猜你喜欢

转载自www.cnblogs.com/jiaxiaoxin/p/11233869.html