python 如何用修飾符打造乙個單例

2021-07-17 04:24:14 字數 2233 閱讀 8345

python的官方wiki給出了乙個用修飾符實現的單例,如下:

def

singleton

(cls):

instance = cls()

instance.__call__ = lambda: instance

return instance

@singleton

class

highlander:

x = 100

class highlander:

x = 100

if __name__ == '__main__':

h = highlander()

print type(h)

print type(highlander)

這裡按常規方式定義了類hightlander,輸出如下:

'classobj'>

'instance'>

這說明highlander是類,而 h 是 hightlander的乙個例項。但是將hightlander用修飾符修飾後,**如下:

def

singleton

(cls):

instance = cls()

instance.__call__ = lambda: instance

return instance

@singleton

class

highlander:

x = 100

if __name__ == '__main__':

h = highlander()

print type(h)

print type(highlander)

輸出如下:

'instance'>

'instance'>

可見,highlander已經確實成為例項了,即例項的名字與類的名字相同,而原來的類名被遮蔽了,那麼 h = highlander() 又是什麼呢?h 實際上是call的返回結果,我們可以再做乙個實驗:

def

singleton

(cls):

instance = cls()

instance.__call__ = lambda: 1

return instance

@singleton

class

highlander:

x = 100

if __name__ == '__main__':

h = highlander()

print type(h)

print type(highlander)

輸出如下:

'int'>

'instance'>

可見,此時 h 就變成整型了,已經跟handlander沒有關係了。

這一切的關鍵在於修飾符到底是怎麼工作的,簡單點說,修飾符會有如下效果:

def

fun1

(f):

...@fun1

deffun2

(): ...

等價於:

def

fun1

(f):

...deffun2

(): ...

fun2 = fun1(fun2)

也就是說,fun2被定義了2次,第一次是原生的,第二次又被fun1定義了一下,所以最終的fun2是fun1的返回值。

def

singleton

(cls):

instance = cls()

instance.__call__ = lambda: instance

return instance

class

highlander:

x = 100

highlander = singleton(highlander)

傳入singleton的引數是類,然後第一步是生成了這個類的乙個例項,第二步是定義了這個例項的__call__函式,第三步是將這個例項返回,singleton的返回值就是類highlander的例項,而從此以後,類名highlander就消失了(被遮蔽了),由此實現了單例。

python 修飾符 python 修飾符

修飾符基礎 閉包 什麼是閉包呢?標準的概念大家可以看wikipedia上的解釋 舉個例子 def do add base def add increase return base increase return add do add函式裡巢狀了乙個內層函式add,這個內層函式就是乙個閉包,其實可以也...

python 修飾符 python訪問修飾符

許可權訪問 偽許可權,只是壓縮時按規則換了變數名,python 的哲學是假定使用者都會使用 xx 以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如 當使用 from m import 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...

python修飾符用法 python修飾符

乾貨大禮包!21天帶你輕鬆學python 文末領取更多福利 本課程來自於千鋒教育在阿里雲開發者社群學習中心上線課程 python入門2020最新大課 主講人姜偉。21天帶你輕鬆學python python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。大資料 人工智慧時代首選程式...