什麼是單例模式?通俗點講:單例模式就是在程序執行的過程當中,類只有一個實例,這不是說單例模式只能去建立一個實例,而是你建立的全部實例(也就是對象)都指的是同一個實例。如何作到這一點呢?咱們的__new__特殊方法就派上用場了,可能你們對這個方法熟悉又陌生,那麼接下來經過一個小程序簡單的過渡一下小程序
class A(): def __new__(cls): return "你好" def __init__(self): print(self) print(A())
猜測一下,這裏控制檯會輸出什麼?學習
輸出結果:你好
這裏再建立A對象的時候就會先執行__new__方法,而後將返回值傳遞給__init__方法的self,因此結果會是:你好,這這段程序中咱們知道對象的建立是依靠__new__方法的,那麼咱們就能夠經過這個方法入手,每次建立對象的時候在__new__方法內部進行判斷,不拐彎抹角了,直接附上爲小夥伴們準備的代碼。code
class A(): _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self): print(self) A() #輸出結果:<__main__.A object at 0x0000020CED433FD0> A() #輸出結果:<__main__.A object at 0x0000020CED433FD0>
此外還有兩種實現單例的方式,我呢也給你們列出來,方便你們學習和參考:對象
# 方式一 def Single(cls,*args,**kwargs): instances = {} def get_instance (*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @Single class B: pass # 方式二 class Single: def __init__(self): print("單例模式實現方式二。。。") single = Single() del Single # 每次調用single就能夠了
經過測驗,能夠清晰對比到兩個對象地址是同樣的,可見咱們的目的就達到了,上面三種實現方式
在使用中也略有不一樣,你們能夠根據須要使用。
謝謝你們的支持!get