#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @date : 2019-01-21 09:09:09
# @author : cdl ([email protected])
# @link :
# @version : $id$
"""單例模式singleton:一種常見的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。
在 python 中,我們可以用多種方法來實現單例模式:
1.使用模組
2.使用__new__
3.使用裝飾器
4.使用元類
"""# 1.使用模組
"""python的模組就是天然的單例模式,因為模組在第一次匯入時,會生成.pyc檔案,當第二次匯入時,就會直接載入 .pyc 檔案,而不會再次執行模組**。因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了
"""from mysingleton import my_singleton
my_singleton.foo(
)# 2.使用__new__()
"""為了使類只能出現乙個例項,可以使用__new__來控制例項的建立過程
"""class
singleton
(object):
_instance =
none
# 類變數
def__new__
(cls,
*args,
**kw):if
not cls._instance:
cls._instance =
super
(singleton, cls)
.__new__(
cls,
*args,
**kw)
# 將類的例項和乙個類變數 _instance 關聯起來
return cls._instance
class
myclass
(singleton)
: a =
1one = myclass(
)two = myclass(
)print
(one is two)
print(id
(one),id
(two)
)# 3.使用裝飾器
"""裝飾器(decorator)可以動態地修改乙個類或函式的功能。也可以使用裝飾器來裝飾某個類,使其只能生成乙個例項
"""from functools import wraps
# 定義了乙個裝飾器 singleton,它返回了乙個內部函式getinstance,該函式會判斷某個類是否在字典instances 中,如果不存在,則會將cls作為 key,cls(*args, **kw) 作為 value存到instances中。否則,直接返回instances[cls]
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# 4.使用元類metaclass
"""元類(metaclass)可以控制類的建立過程,它主要做三件事:
a.攔截類的建立
b.修改類的定義
c.返回修改後的類
"""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]
class
myclass
(metaclass=singleton)
:pass
參考部落格 python3單例模式
單例模式是某個類在整個系統中只存在乙個例項的一種設計模式。使用單例模式的好處 單例模式不僅可以減少記憶體資源占用,而且因為只初始化一次,還可以加快執行效能。例如當程式通過乙個類來讀取配置資訊,而程式多個地方需要使用配置資訊,這時整個程式執行過程中只需乙個例項物件即可,可減少占用記憶體資源,同時還可以...
Python3 單例模式問題
單例模式,也叫單子模式,是一種常用的軟體設計模式,屬於建立型模式的一種。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取...
python3 魔術方法之單例模式(四)
class singleclass object instance 0def new cls,args,kwargs if not cls.instance cls.instance object new cls,args,kwargs return cls.instance return cls....