python設計模式之單例模式(二)

2022-02-21 22:20:25 字數 2454 閱讀 3507

上次們討論的是gof的單例設計模式,該模式是指:乙個類有且只有乙個物件。通常我們需要的是讓例項共享乙個相同的裝態 比如資料庫連線。alex martelli的建議的是開發人員應該關注狀態和行為,而不是同一性,因此它也被稱為monostate(單態)模式。

先說說 monostate 這個單詞的意思,設計模式的名字都是很有意思的,因為為了方便交流、記憶,所以設計模式的命名都對 該模式的意圖進行了表述。 mono 是乙個詞根,英語中 mono,mon 都表示的是 1 的意思, state 意思為 " 狀態 " 。 monostate 的意思就是 " 單一的狀態 ",monostate 並不限制建立物件的個數,但是它的狀態卻只有乙個狀態

我們知道在python中,__dict__是用來儲存物件屬性的乙個字典,其鍵為屬性名,值為屬性的值。所以下面我們可以使用dict來儲存乙個類所有物件的狀態。來看下面這個例子:

class

usedict:

__state=

def__init__

(self):

self.age=27

self.__dict__=self.__state

m=usedict()

m1=usedict()

m.age=23

print(m)

print(m1)

print(m.__dict__)

print(m1.__dict__)

執行以後輸出結果。

<__builtin__.usedict instance at 0x7f78ceacc098>

<__builtin__.usedict instance at 0x7f78ceacc128>

首先我們看結果 我們發現每次對usedict例項化都會建立乙個新的物件,然後我們通過m修改了age屬性的值後,m1的age屬性值也發生了變化。

除此之外我們還可以使用__new__方法本身來實現。

class

usenew

(object):

_state={}

def__new__

(cls,*args,**kwargs):

obj=super(usenew,cls).__new__(cls,*args,**kwargs)

obj.__dict__=cls._state

return obj

a=usenew()

a1=usenew()

a.x=3

print(a)

print(a1)

print(a.__dict__)

print(a1.__dict__)

下面是輸出結果

object at 0x7f78ceb873d0>

object at 0x7f78ceb87b50>

兩種寫法的效果是一樣的。

元類是乙個類的類,這就意味著該類是它的元類的例項。對於已經存在的類來說,當需要建立物件的時候,將呼叫python的特殊方法__call__,我們可以通過使用元類的__call__方法,來控制乙個物件的例項化,具體看下面的例子

乙個資料庫連線的例子

import pymysql

class

metasingleton

(type):

_inst={}

def__call__

(cls,*args,**kwargs):

if cls not

in cls._inst:

cls._inst[cls]=super(metasingleton,cls).__call__(*args,**kwargs)

return cls._inst[cls]

class

mysqldb

(metaclass=metasingleton):

connection=none

defconn

(self):

if self.connection is

none:

self.connection= pymysql.connect(host='127.0.0.1', port=3306, user='root',

passwd='aa1234', db='user', charset='utf8mb4')

self.cursor=self.connection.cursor()

return  self.cursor

d1=mysqldb().conn()

d2=mysqldb().conn()

介紹了這麼長時間的單例模式,也許你會有疑問,那單例模式有什麼缺點呢?

雖然單例模式的效果很好但是依然存在一些問題,因為單例具有全域性訪問許可權,所以可能出現以下問題:

Python設計模式之單例模式

站 物件 印表機 物件 使用類名 建立物件時,python 的直譯器首先 會 呼叫 new 方法為物件 分配空間。new 是乙個 由object基類提供的內建的靜態方法,主要作用有兩個 python 的直譯器獲得物件的 引用 後,將引用作為 第乙個引數,傳遞給 init 方法。重寫 new 方法 的...

python設計模式之單例模式

單例模式是一種建立型設計模式,它確保乙個類有且只有乙個特定型別的物件,並提供全域性訪問點。其意圖為 簡單理解 單例即為單個例項,也就是每次例項化建立物件時獲得的都是同乙個物件,當然同乙個物件的屬性都是相同的,方法也是相同的,位址也是相同的,這樣給我們帶來的好處就是可以避免消耗過多的記憶體或cpu資源...

Python設計模式之單例模式

單例模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。單例模式是獲取全域性狀態的一種相當好的方法,但這也是對於單例模式的主要批評之處,因為在...