單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例程式設計客棧類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。
單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。在python中,單例模式有以下幾種實現方式。
方法一、實現__new__方法,然後將類的乙個例項繫結到類變數_instance上;如果cls._instance為none,則說明該類還沒有被例項化過,new乙個該類的例項,並返回;如果cls._instance不esfhdkotzy為none,直接返回_instance,**如下:
class singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
return cls._instance
class myclass(singleton):
a = 1
one = myclass()
two = myclass()
#one和two完全相同,可以用id(), ==, is檢測
print id(one) # 29097904
print id(two) # 29097904
print one == two # true
print one is two # true
方法二、本質上是方法一的公升級版,使用__m程式設計客棧etaclass__(元類)的高階python用法,具體**如下:
class singleton2(type):
def __init__(cls, name, bases, dict):
super(singleton2, cls).__init__(name, 程式設計客棧bases, dict)
cls._instance = none
def __call__(cls, *args, **kwargs):
if cls._instance is none:
cls._instance = super(singleton2, cls).__call__(*args, **kwargs)
return cls._instance
class myclass2(object):
__metaclass__ = singleton2
a = 1
one = myclass2()
two = myclass2()
print id(one) # 31495472
print id(two) # 31495472
print one == two # true
p程式設計客棧rint one is two # true
方法三、使用python的裝飾器(decorator)實現單例模式,這是一種更pythonic的方法;單利類本身的**不是單例的,通裝飾器使其單例化,**如下:
def singleton(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@singleton
class myclass3(object):
a = 1
one = myclass3()
two = myclass3()
print id(one) # 29660784
print id(two) # 29660784
print one == two # true
print one is two # true
本文標題: 常見的在python中實現單例模式的三種方法
本文位址:
在 Python 中實現單例模式
cyrusin.github.io 2015 09 15 python singleton 20150915 有些時候你的專案中難免需要一些全域性唯一的物件,這些物件大多是一些工具性的東西,在python中實現單例模式並不是什麼難事。以下總結幾種方法 使用類裝飾器 使用裝飾器實現單例類的時候,類本身...
python中的單例實現
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。單例模式的要點有三個 一是某個類只能有乙個...
python中單例模式的實現
單例模式 保證系統中乙個類只有乙個例項而且該例項利於外界訪問。下面是python實現單例模式的一種方式。這裡用了重寫new方法來實現單例模式。在python中 new 方法是乙個靜態方法 它在物件被建立時呼叫,為物件分配空間,並且返回乙個位址傳給 init 方法 new 方法的第乙個引數是表示當前類...