使用裝飾器建立單例類

單例是一種模式,它將類的例項化限制為一個例項/物件。使用裝飾器,我們可以通過強制類返回類的現有例項或建立新例項(如果它不存在)來將類定義為單例。

def singleton(cls):    
    instance = [None]
    def wrapper(*args, **kwargs):
        if instance[0] is None:
            instance[0] = cls(*args, **kwargs)
        return instance[0]

    return wrapper

可以將此裝飾器新增到任何類宣告中,並確保最多建立一個類的一個例項。任何後續呼叫都將返回已存在的類例項。

@singleton
class SomeSingletonClass:
    x = 2
    def __init__(self):
        print("Created!")

instance = SomeSingletonClass()  # prints: Created!
instance = SomeSingletonClass()  # doesn't print anything
print(instance.x)                # 2

instance.x = 3
print(SomeSingletonClass().x)    # 3

因此,無論你是通過本地變數引用類例項還是建立另一個例項,都始終獲得相同的物件。