? Python單例設(shè)計(jì)模式

參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?/a>

單例指一個(gè)對象只生成一個(gè)實(shí)例,也就是說對象只會在內(nèi)存中分配一塊區(qū)域。比如Music player,一次只能播放一個(gè)歌曲,只分配一塊內(nèi)存給它,不能同時(shí)播放兩首歌。只有當(dāng)它銷毀了,才會生成一個(gè)空間給另一首歌。

image
image

要想達(dá)到單例這種效果、這種設(shè)計(jì)模式,就需要涉及內(nèi)存分配問題。既然涉及到內(nèi)存分配問題,就需要用到對象的內(nèi)置函數(shù)中涉及內(nèi)存分配的__new__函數(shù)來完成。

__new__方法有兩個(gè)作用:

  • 在內(nèi)存中為對象分配空間
  • 返回對象的引用

而實(shí)現(xiàn)單例設(shè)計(jì)模式,就是對__new__方法的重寫!

重寫new方法時(shí)需要注意:

image
image

如果沒有在重寫new時(shí)候返回對象引用,那么在生成實(shí)例時(shí),就只能得到一個(gè)None

重寫單例對象的new方法的固定格式(必須要遵守):

def __new__(cls, *args, **kwargs):
    # Your code
    # ........
    # ........

    # Return the generated instance of the object
    return super().__new__(cls)

如果在new中實(shí)現(xiàn)單例的設(shè)計(jì)模式呢?
主要思路如下:

  • 添加一個(gè)類屬性
  • 將這個(gè)類屬性的初始值為None
  • 如果有實(shí)例被創(chuàng)建,這個(gè)類屬性就為
  • 再有實(shí)例被創(chuàng)建時(shí),如果發(fā)現(xiàn)類屬性為None,則不創(chuàng)建,且返回之前已創(chuàng)建的實(shí)例
image
image

代碼如下(非常固定,沒什么需要改的):

class MyClass(object):

    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance = super().__new__(cls)
            
        return cls.instance

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,674評論 1 32
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個(gè)常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,913評論 0 27
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮啙嵰锥?,是?xiàng)目中最...
    成熱了閱讀 4,545評論 4 34
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,630評論 1 8
  • 第3天·21天OH卡美顏瘦身課 #玩卡不卡·每日一抽# 每一位都可以通過這張卡片覺察自己: 1、直覺他叫什么名字?...
    天鷺閱讀 276評論 0 0

友情鏈接更多精彩內(nèi)容