單利模式詳細分析

2021-09-26 13:37:51 字數 2524 閱讀 9258

單利模式:所謂單例模式就是乙個類只能建立乙個例項化。

python中的內建函式__new__(), 它跟__init__()一樣, 都是物件在被建立出來的時候, 就自動執行的乙個函式, init()函式, 是為了給函式初始化屬性值的, 而__new__()這個函式, 就是為了給物件在被例項化的時候, 分配一塊記憶體位址, 因此, 我們可以重寫__new__()這個方法, 讓他在第一次例項化乙個物件之後, 分配一塊位址, 在此後的所有例項化的其他物件時, 都不再分配新的位址, 而繼續使用第乙個物件所被分配的位址, 因此, 我們可以在類物件裡, 定義乙個類屬性, 初始值設為none, 如果這個值是none就呼叫父類的__new__()方法, 為其分配位址, 並返回這個位址(__new__方法一定要返回乙個位址)

class earth(object):

__instance=none #定義乙個類屬性做判斷

def __new__(cls):

if cls.__instance==none:

#如果__instance為空證明是第一次建立例項

#通過父類的__new__(cls)建立例項

cls.__instance=object.__new__(cls)

return  cls.__instance

else:

#返回上乙個物件的引用

return cls.__instance

1 檔案匯入的形式:

將foo類在某個檔案(test1.py)中例項化,賦值給某個變數v。在其他檔案如test2.py中引入該例項,多次引用列印其記憶體位址,發現是一樣。

2 基於__new__來實現單例。

當程式初始化之前,會先呼叫__new__方法。在類中實現如下new方法。

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

if not hasattr(singletondbpool, "_instance"):

with singletondbpool._instance_lock:

if not hasattr(singletondbpool, "_instance"):

singleton._instance = object.__new__(cls, *args, **kwargs)

return singleton._instance

3 使用裝飾器(decorator),

#這是一種更pythonic,更elegant的方法,

#單例類本身根本不知道自己是單例的,因為他本身(自己的**)並不是單例的

def singleton(cls, *args, **kw):

instances = {}

def _singleton():

if cls not in instances:

instances[cls] = cls(*args, **kw)

return instances[cls]

return _singleton

@singleton

class myclass4(object):

a = 1

def __init__(self, x=0):

self.x = x

one = myclass4()

two = myclass4()

4 共享屬性;所謂單例就是所有引用(例項、物件)擁有相同的狀態(屬性)和行為(方法)

所有例項共享屬性的最簡單最直接的方法就是__dict__屬性指向(引用)同乙個字典(dict)

#可參看:

class borg(object):

_state = {}

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

ob = super(borg, cls).__new__(cls, *args, **kw)

ob.__dict__ = cls._state

return ob

class myclass2(borg):

a = 1

one = myclass2()

two = myclass2()

5 使用__metaclass__(元類)的高階python用法

class singleton2(type):

def __init__(cls, name, bases, dict):

super(singleton2, cls).__init__(name, bases, dict)

cls._instance = none

def __call__(cls, *args, **kw):

if cls._instance is none:

cls._instance = super(singleton2, cls).__call__(*args, **kw)

return cls._instance

class myclass3(object):

__metaclass__ = singleton2

one = myclass3()

two = myclass3()

「命令模式」詳細分析

答 命令模式是一種行為型的設計模式,為了實現請求者和接收者 執行者 的解耦,將請求的呼叫封裝成乙個命令物件,由命令物件來通知並讓接收者完成相應的任務。答 命令模式中主要包含了三個物件 命令類 訂單 也就是實現統一命令介面的命令 執行者 廚師 也就是真正執行命令的人 命令呼叫者 服務員 進行命令傳遞的...

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...