天天看點

單例設計模式 | 手把手教你入門Python之六十一

上一篇: 類方法和靜态方法的使用 | 手把手教你入門Python之六十 下一篇: 類屬性案例練習 | 手把手教你入門Python之六十二 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。

單例設計模式

__new__和__init__⽅法

class A(object):
    def __init__(self):
        print("這是 init ⽅法")

    def __new__(cls):
        print("這是 new ⽅法")
        return object.__new__(cls)
        
A()           

總結

  • __new__

    ⾄少要有⼀個參數cls,代表要執行個體化的類,此參數在執行個體化時由Python解釋器⾃動提供
  • __new__

    必須要有傳回值,傳回執行個體化出來的執行個體,這點在⾃⼰實作

    __new__

    時要特别注意,可以return⽗類

    __new__

    出來的執行個體,或者直接是object的

    __new__

    出來的執行個體
  • __init__

    有⼀個參數self,就是這個

    __new__

    傳回的執行個體,

    __init__

    __new__

    的基礎上可以完成⼀些其它初始化的動作,

    __init__

    不需要傳回值

舉個常⻅的單例模式例⼦,我們⽇常使⽤的電腦上都有⼀個資源回收筒,在整個作業系統中,資源回收筒隻能有⼀個執行個體,整個系統都使⽤這個唯⼀的執行個體,⽽且資源回收筒⾃⾏提供⾃⼰的執行個體。是以資源回收筒是單例模式的應⽤。

確定某⼀個類隻有⼀個執行個體,⽽且⾃⾏執行個體化并向整個系統提供這個執行個體,這個類稱為單例類,單例模式是⼀種對象建立型模式。

# 執行個體化⼀個單例
class Singleton(object):
    __instance = None
    __is_first = True

    def __new__(cls, age, name):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, age, name):
        if self. __is_first: # 不會再建立第⼆個對象
            self.age = age
            self.name = name
            Singleton. __is_first = False


a = Singleton(18, "張三")
b = Singleton(28, "張三")

print(id(a))
print(id(b))

print(a.age) # 18
print(b.age) # 18

a.age = 19
print(b.age)           
單例設計模式 | 手把手教你入門Python之六十一

配套視訊