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 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。大資料 人工智慧時代首選程式...