Python面向對象之單例模式

單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某
一個類只有一個實例存在。當你但願在整個系統中,某個類只能出現一個實例時,單例對象就
能派上用場。
單例類:若是一個類,從頭至尾只開闢了一塊屬於對象的空間,那麼這個類就是一個單例類。


準備工做:
----#__init__()方法叫初始化方法
----#__new__()方法叫構造方法

例子:
<1>
class A:
    def __new__(cls, *args, **kwargs):
        print('new')
    def __init__(self):
        print('init')
a = A()
結果:new

<2>
class A:
    def __new__(cls, *args, **kwargs):
        print('new')
        obj = super().__new__(cls)
        return obj
    def __init__(self):
        print('init')
a = A()
結果:new
     init

須要知道,咱們實例化對象的時候,會有三個步驟:
1.開闢一個空間,給對象
2.把對象的空間傳給self,並執行init方法
3.將這個對象的空間返回給調用者

第一步的開闢一個空間就是構造函數 __new__()來完成的。
第二步,將對象空間傳給self,咱們從例子<1>能夠看出,
不返回空間,self是不會收到的,因此咱們給出了例子<2>
這樣第二步就執行了。
第三步,咱們將對象的空間返回給調用者。

__new__()方法在何時執行?
答:在實例化以後,__init__()以前,先執行 __new__()來建立一塊空間

瞭解這些,咱們就開始寫一個單例類:
單例類:若是一個類,從頭至尾只開闢了一塊屬於對象的空間,那麼這個類就是一個單例類。

例子:
<1>
class Single:
    __INSTANCE = None

    def __new__(cls, *args, **kwargs):
        if not cls.__INSTANCE:
            cls.__INSTANCE = super().__new__(cls)
        return cls.__INSTANCE


s0 = Single()
s1 = Single()
print(s0)
print(s1)
結果:
    <__main__.Single object at 0x10e7f0630>
    <__main__.Single object at 0x10e7f0630>

<2>
class Foo:
    __INSTANCE = None

    @classmethod
    def get_instance(cls):
        if cls.__INSTANCE:
            return cls.__INSTANCE
        else:
            cls.__INSTANCE = Foo()
            return cls.__INSTANCE
f0 = Foo()
f1 = Foo()
print(f0.get_instance())
print(f1.get_instance())
結果:
    <__main__.Foo object at 0x10f4354e0>
    <__main__.Foo object at 0x10f4354e0>
相關文章
相關標籤/搜索