Python單例模式的4種實現方法

2021-06-20 01:26:21 字數 4567 閱讀 4391

python單例模式的4種實現方法:

#-*- encoding=utf-8 -*- 

print

'----------------------方法1--------------------------'

#方法1,實現__new__方法 

#並在將乙個類的例項繫結到類變數_instance上, 

#如果cls._instance為none說明該類還沒有例項化過,例項化該類,並返回 

#如果cls._instance不為none,直接返回cls._instance 

classsingleton(object):  

def__new__(cls, *args, **kw):  

if

nothasattr(cls, '_instance'

):  

orig = super(singleton, cls)  

cls._instance = orig.__new__(cls, *args, **kw)  

return

cls._instance  

classmyclass(singleton):  

a = 1

one = myclass()  

two = myclass()  

two.a = 3

printone.a  

#3   

#one和two完全相同,可以用id(), ==, is檢測 

printid(one)  

#29097904 

printid(two)  

#29097904 

printone == two  

#true 

printoneistwo  

#true 

print

'----------------------方法2--------------------------'

#方法2,共享屬性;所謂單例就是所有引用(例項、物件)擁有相同的狀態(屬性)和行為(方法) 

#同乙個類的所有例項天然擁有相同的行為(方法), 

#只需要保證同乙個類的所有例項具有相同的狀態(屬性)即可 

#所有例項共享屬性的最簡單最直接的方法就是__dict__屬性指向(引用)同乙個字典(dict) 

#可參看: 

classborg(object):  

_state = {}  

def__new__(cls, *args, **kw):  

ob = super(borg, cls).__new__(cls, *args, **kw)  

ob.__dict__ = cls._state  

returnob  

classmyclass2(borg):  

a = 1

one = myclass2()  

two = myclass2()  

#one和two是兩個不同的物件,id, ==, is對比結果可看出 

two.a = 3

printone.a  

#3   

printid(one)  

#28873680 

printid(two)  

#28873712 

printone == two  

#false 

printoneistwo  

#false 

#但是one和two具有相同的(同乙個__dict__屬性),見: 

printid(one.__dict__)  

#30104000 

printid(two.__dict__)  

#30104000 

print

'----------------------方法3--------------------------'

#方法3:本質上是方法1的公升級(或者說高階)版 

#使用__metaclass__(元類)的高階python用法 

classsingleton2(type):  

def__init__(cls, name, bases, dict):  

super(singleton2, cls).__init__(name, bases, dict)  

cls._instance = none

def__call__(cls, *args, **kw):  

if

cls._instanceis

none:  

cls._instance = super(singleton2, cls).__call__(*args, **kw)  

return

cls._instance  

classmyclass3(object):  

__metaclass__ = singleton2  

one = myclass3()  

two = myclass3()  

two.a = 3

printone.a  

#3   

printid(one)  

#31495472 

printid(two)  

#31495472 

printone == two  

#true 

printoneistwo  

#true 

print

'----------------------方法4--------------------------'

#方法4:也是方法1的公升級(高階)版本, 

#使用裝飾器(decorator), 

#這是一種更pythonic,更elegant的方法, 

#單例類本身根本不知道自己是單例的,因為他本身(自己的**)並不是單例的 

defsingleton(cls, *args, **kw):  

instances = {}  

def_singleton():  

if

clsnot

ininstances:  

instances[cls] = cls(*args, **kw)  

returninstances[cls]  

return_singleton 

@singleton

classmyclass4(object):  

a = 1

def__init__(self, x=0):  

self.x = x  

one = myclass4()  

two = myclass4()  

two.a = 3

printone.a  

#3   

printid(one)  

#29660784 

printid(two)  

#29660784 

printone == two  

#true 

printoneistwo  

#true 

one.x = 1

printone.x  

#1   

printtwo.x  

#1  

Python單例模式的4種實現方法

encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...

Python單例模式的4種實現方法

encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...

Python單例模式的4種實現方法

print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class singleton objec...