Python中的單例模式

2021-09-26 16:40:40 字數 2298 閱讀 9207

單例模式(singleton patterns) 是一種常用的軟體設計模式, 該模式的主要目的是確保某乙個類只有乙個示例存在.

其實, python的模組就是天然的單例模式, 因為模組在第一次匯入時, 會生成".pyc"檔案, 當第二次匯入時, 就會直接載入".pyc"檔案, 而不會再次執行模組**.

# 將類的例項和乙個類變數_instance關聯起來, 如果cls._instance為none則建立例項, 否則直接返回cls._instance

class

singleton

(object):

_instance =

none

def__new__

(cls,

*args,

**kwargs):if

not cls._instance:

cls._instance =

super

(singleton, cls)

.__new__(cls,

*args,

**kwargs)

return cls._instance

class

myclass

(singleton)

: a =

1one = myclass(

)two = myclass(

)if one == two:

print

("true"

)if one is two:

print

("true")if

id(one)

==id

(two)

:print

("true"

)# 列印結果如下:

true

true

true

[finished in

0.1s]

# 

from functools import wraps

defsingleton

(cls)

: instances =

@wraps(cls)

defgetinstance

(*args,

**kwargs)

:if cls not

in instances:

instances[cls]

= cls(

*args,

**kwargs)

:return instances[cls]

return getinstance

@singleton

class

myclass

(object):

a =1

class

singleton

(type):

_instances =

def__call__

(cls,

*args,

**kwargs)

:if cls not

in cls._instances:

cls._instances[cls]

=super

( singleton, cls)

.__call__(

*args,

**kwargs)

return cls._instances[cls]

# 元類(metaclass)可以控制類的建立過程, 主要做三件事

# 1. 攔截類的建立

# 2. 修改類的定義

# 3. 返回修改後的類

# python2

# class myclass(object):

# __metaclass__ = singleton

# python3

class

myclass

(metaclass=singleton)

: a =

1one = myclass(

)two = myclass(

)if one == two:

print

("true"

)if one is two:

print

("true")if

id(one)

==id

(two)

:print

("true"

)# 列印結果和上面的一模一樣

python中單例模式

一 單例模式設計基礎概念 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。目的 讓類建立物件,在系統中只有唯一的乙個實例子 每一次執行類名 返回的物件 記憶體...

python中的單例模式

單例模式 顧名思義是只有乙個例項記憶體位址,根據意思理解就是不論建立多少個例項物件,都只有乙個記憶體位址,單例模式是基於類的,是例項類物件,有別與 init init 是例項化物件.如下 domeclass single instance object instance none def init ...

Python 中的單例模式

單例就是解決在記憶體中始終只有乙個例項物件的問題,在python中實現起來很簡單,python中是通過new函式來分配記憶體的,舉個栗子 class musicplayer instance none def new cls,args,kwargs if cls.instance is none c...