單例模式(singleton pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。
在 python 中,我們可以用多種方法來實現單例模式:
一、模組:
其實,python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成.pyc
檔案,當第二次匯入時,就會直接載入.pyc
檔案,而不會再次執行模組**。因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了
# mysingleton.py使用:class my_singleton(object
): def foo(self):
pass
my_singleton = my_singleton()
from二、使用mysingleton import my_singleton
my_singleton.foo()
__new__
__new__方法接受的引數雖然也是和__init__一樣,但__init__是在類例項建立之後呼叫,而 __new__方法正是建立這個類例項的方法。
class singleton(object在上面的**中,我們將類的例項和乙個類變數): _instance =none
def __new__(cls, *args, **kw):
ifnot cls._instance:
cls._instance = super(singleton, cls).__new__(cls, *args, **kw)
return
cls._instance
class
myclass(singleton):
a = 1
class singleton(object
): def __new__(cls):
# 關鍵在於這,每一次例項化的時候,我們都只會返回這同乙個instance物件
if not hasattr(cls, '
instance'):
cls.instance =super(singleton, cls).__new__(cls)
return
cls.instance
obj1 =singleton()
obj2 =singleton()
obj1.attr1 = '
value1
'print obj1.attr1, obj2.attr1
print obj1
is obj2
_instance
關聯起來,如果cls._instance
為 none 則建立例項,否則直接返回cls._instance
三、使用裝飾器
from注:functools.wraps 則可以將原函式物件的指定屬性複製給包裝函式物件, 預設有 __module__、__name__、__doc__,或者通過引數選擇functools import wraps
def singleton(cls):
instances ={}
@wraps(cls)
def getinstance(*args, **kw):
if cls not in
instances:
instances[cls] = cls(*args, **kw)
return
instances[cls]
return
getinstance
@singleton
class myclass(object
): a = 1
#不加wrapsfunctionstools.wraps#coding=utf-8
# -*- coding=utf-8 -*-
from
functools import wraps
def my_decorator(func):
'''''
decorator
'''print(
'calling decorated function...
')
return func(*args, **kwargs)
return
@my_decorator
def example():
"""docstring
"""print(
'called example function
')
print(example.__name__, example.__doc__)
#結果:(
'', '
decorator')
[finished in0
.2s]
#加wraps
#coding=utf-8
# -*- coding=utf-8 -*-
from
functools import wraps
def my_decorator(func):
@wraps(func)
'''''
decorator
'''print(
'calling decorated function...
')
return func(*args, **kwargs)
return
@my_decorator
def example():
"""docstring
"""print(
'called example function
')
print(example.__name__, example.__doc__)
執行結果:('
example
', '
docstring')
[finished
in0.5s]
四、使用 metaclass
元類(metaclass)可以控制類的建立過程,它主要做三件事:
classsingleton(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]
# python2
class myclass(object
): __metaclass__ =singleton
# python3
# class myclass(metaclass=singleton):
# pass
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...