在網上看了有關python實現單例模式的部落格,發現好多都是**的,並且都是按照python2.x版本舊式類的方式寫的。
雖然也能讀懂,但對於我這種一開始學的就是python3.x的新手來說,心裡總有點彆扭。
所以今天我就把蒐集來的單例模式稍加修改一下,以新式類的方式寫下來。
1.在寫**之前,先理解乙個概念,那就是元類metaclass,
深刻理解python中的元類(metaclass)
所以下面會用到__metaclass__建立類來實現單例
2.下面是不同方法實現單例的**
方法一:通過__new__方法實現單例
1class
singleton:
2def
__new__(cls,*args,**kwargs):3if
not hasattr(cls, '
_instance'):
4 cls._instance = super().__new__(cls,*args,**kwargs)
5return
cls._instance67
class
myclass:
8__metaclass__ =singleton910
(myclass())
11print(myclass())
方法二:通過元類實現單例
1class
singleton:
2def
__init__(cls,*args, **kwargs):
3 super().__init__(*args, **kwargs)
4 cls.instance =none
5def
__call__(cls, *args, **kwargs):
6if cls.instance is
none:
7 cls.instance = super().__call__(*args, **kwargs)
8return
cls.instance910
class
myclass:
11__metaclass__ =singleton
1213
(myclass())
14print(myclass())
方法三:通過decorator裝飾器實現單例
1def singleton(cls, *args, **kwargs):
2 instances ={}
3def
get_instance():
4if cls not
ininstances:
5 instances[cls] = cls(*args, **kwargs)
6return
instances[cls]
7return
get_instance89
@singleton
10class
myclass:
11__metaclass__ =singleton
1213
(myclass())
14print(myclass())
方法四:通過匯入模組實現單例
1#file1/mysingleton.py23
4class
singleton:
5def
foo(self):
6pass
78 singleton = singleton()
注意:以上**為乙個單獨模組,使用時直接匯入即可。
1 form mysingleton importsingleton
23 a =singleton
4 b =singleton56
(a)7
pring(b)
8print(a is b)
Python基礎 22新式類
1 工廠函式 由於型別和類的統一,因而可以子類化python資料型別。但是所有的python 內建的轉換函式現在都是工廠函式。當這些函式被呼叫時,你實際上是對相應的型別進行例項化。比如下面的函式都已經成為工廠函式 int long float complex str unicode list tup...
python元類單例 元類實現單例模式
python中的類也是物件。元類就是用來建立這些類 物件 的,元類就是類的類,你可以這樣理解為 myclass metaclass 元類建立 myobject myclass 類建立例項 實際上myclass就是通過type 來創建立出myclass類,它是type 類的乙個例項 同時myclass...
python手寫單例 Python實現單例模式
語言是共通的,想要用不同語言實現單例模式,首先要清楚什麼是單例模式,單例模式即乙個類有且僅有乙個例項,那麼通過python怎麼實現乙個類只能有乙個例項呢。首先先建立乙個類,比如宇宙只有乙個地球 class earth pass a earth print id a b earth print id ...