python3中的單例模式Singleton

2021-09-12 08:04:37 字數 2424 閱讀 9096

#!/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....