在這之前,先了解super()和__new__()方法
super()方法:
返回乙個父類或兄弟類型別的**物件,讓你能夠呼叫一些從繼承過來的方法。
它有兩個典型作用:
a. 在單繼承的類層次結構中,super()可用於引用父類而不顯式父類名稱,從而使**更易於維護。
b. 在多重繼承中,可以保證公共父類僅被執行一次。
__new__方法:
a.它是乙個類級別的靜態方法。通常用於控制生成乙個新例項的過程。
b.返回的是乙個例項化出來的例項
下面為四種實現單例模式的方法
使用__new__方法
class
singleton
(object):
def__new__
(cls,
*args,
**kwargs):if
nothasattr
(cls,
'_instance'):
orig =
super
(singleton, cls)
cls._instance = orig.__new__(cls,
*args,
**kwargs)
rerurn cls._instance
class
a(singleton)
:pass
# 類a即為單例類
2.共享屬性
'''
'''# 建立例項時把所有例項的__dict__指向同乙個字典,這樣它們都具有相同的屬性和方法(類的__dict__儲存物件屬性)
class
singleton
(object):
_state =
def__new__
(cls,
*args,
**kwargs)
: ob =
super
(singleton,cls)
.__new__(cls,
*args,
**kwargs)
ob.__dict__ = cls._state
return ob
class
b(singleton)
:pass
# 類b即為單例類
3.使用裝飾器
'''
'''def
singleton
(cls)
: instance =
def():
if cls not
in instance:
instance[cls]
= cls(
*args,
**kwargs)
return instance[cls]
@singleton
classc:
pass
# 類c即為單例類
4.import方法
# 作為python模組時是天然的單例模式
#建立乙個sington.py檔案,內容如下:
class
singleton
(object):
deffoo
(self)
:pass
mysington = singleton(
)# 運用
from sington import mysington
mysington.foo(
)
單例模式 四種
餓漢式 單例模式 餓漢式類載入到記憶體後,例項化乙個單例,jvm保證執行緒安全 都不能建立新的,所以安全,多執行緒都是安全的 簡單易用 缺點 不管是否用到,類載入時候就會例項化,浪費 一般專案開發中載入是用的class.forname 將class載入到記憶體,但不例項化,此時,如果使用餓漢,就會消...
python四種實現單例模式
coding utf 8 author xianyt date 2018 func 在預設的情況下建立多個物件的id不相同,如果想要設定為單例模式,可以通過 new 方法中的 instance 在 new 方法中把類例項繫結到類變數 instance上,如果cls.instance為none表示該類...
四種單例設計模式
public class singletonlazy 私有化該類的構造器 public static singletonlazy getinstance 如果沒有例項,就建立乙個 return instance 返回例項物件 public class singletonhungary 私有化該類的構...