單利模式:所謂單例模式就是乙個類只能建立乙個例項化。
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的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...