python基礎 新式類實現單例模式

2022-07-21 20:33:22 字數 2107 閱讀 1087

在網上看了有關python實現單例模式的部落格,發現好多都是**的,並且都是按照python2.x版本舊式類的方式寫的。

雖然也能讀懂,但對於我這種一開始學的就是python3.x的新手來說,心裡總有點彆扭。

所以今天我就把蒐集來的單例模式稍加修改一下,以新式類的方式寫下來。

1.在寫**之前,先理解乙個概念,那就是元類metaclass,

深刻理解python中的元類(metaclass)

所以下面會用到__metaclass__建立類來實現單例

2.下面是不同方法實現單例的**

方法一:通過__new__方法實現單例

1

class

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

print

(myclass())

11print(myclass())

方法二:通過元類實現單例

1

class

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

print

(myclass())

14print(myclass())

方法三:通過decorator裝飾器實現單例

1

def 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

print

(myclass())

14print(myclass())

方法四:通過匯入模組實現單例

1

#file1/mysingleton.py23

4class

singleton:

5def

foo(self):

6pass

78 singleton = singleton()

注意:以上**為乙個單獨模組,使用時直接匯入即可。

1 form mysingleton import

singleton

23 a =singleton

4 b =singleton56

print

(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 ...