# _*_ coding:utf-8 _*_
''' @author:xianyt
@date:2018/
@func:
''''''
在預設的情況下建立多個物件的id不相同,如果想要設定為單例模式,可以通過__new__()方法中的__instance
在__new__方法中把類例項繫結到類變數_instance上,如果cls._instance為none表示該類還沒有例項化過,例項化該類並返回。如果cls_instance不為none表示該類已例項化,直接返回cls_instance
''''''第一種實現單例模式'''
print('---------第一種-------------')
class single(object):
__instance=none
def __new__(cls):
if cls.__instance==none:
# 如果__instance為空說明這次是第一次建立例項
# 通過父類的__new__建立例項
cls.__instance=object.__new__(cls)
return cls.__instance
else:
#返回上乙個物件的引用
return cls.__instance
a = single()
b = single()
print(id(a)==id(b))
'''方式二
共享屬性;所屬單例就是所有引用(例項、物件)擁有相同的狀態和行為
同乙個類的所有例項天然擁有相同的行為
只需要保證同乙個類的所有例項具有相同的狀態
所有例項共享屬性的最簡單最直接的方法就是__dict__屬性屬性指向同乙個字典(dict)
'''print('---------第二種-------------')
class borg(object):
_state = {}
def __new__(cls, *args, **kw):
ob = super(borg, cls).__new__(cls, *args, **kw)
ob.__dict__=cls._state
class myclass2(borg):
a = 1
one = myclass2()
two = myclass2()
print(id(one)==id(two))
''' 本質上上算上方式1
使用_metaclass__的高階python用法
'''print('---------第三種(python2)-------------')
class singleton2(type):
def __init__(cls, name, bases, dict):
super(singleton2, cls).__init__(name, bases, dict)
cls._instance = none
def __call__(cls, *args, **kw):
if cls._instance is none:
cls._instance = super(singleton2, cls).__call__(*args, **kw)
return cls._instance
class myclass3(object):
__metaclass__ = singleton2
one = myclass3()
two = myclass3()
print(id(one) == id(two))
print('---------第三種(python3)-------------')
class singleton3(type):
def __new__(cls, name, bases, attrs):
attrs["instance"] = none
return super(singleton3, cls).__new__(cls, name, bases, attrs)
def __call__(cls, *args, **kw):
if cls.instance is none:
cls.instance = super(singleton3, cls).__call__(*args, **kw)
return cls.instance
class myclass4(metaclass=singleton3):
pass
one = myclass4()
two = myclass4()
print(id(one) == id(two))
''' 使用高階裝飾器
這是一種更pythonic,更elegant的方法
'''print('---------第四種-------------')
def singleton(cls):
instance = {}
def _singleton(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return _singleton
@singleton
class myclass4(object):
a = 1
def __init__(self, x=0):
self.x = x
one = myclass4()
two = myclass4()
print(id(one) == id(two))
單例模式 四種
餓漢式 單例模式 餓漢式類載入到記憶體後,例項化乙個單例,jvm保證執行緒安全 都不能建立新的,所以安全,多執行緒都是安全的 簡單易用 缺點 不管是否用到,類載入時候就會例項化,浪費 一般專案開發中載入是用的class.forname 將class載入到記憶體,但不例項化,此時,如果使用餓漢,就會消...
四種方式實現單例模式
乙個類中只有乙個例項,除此外沒有其他的例項模式,有三種特性 構造器不可被外部建立 限制了外部的訪問方式 內部保證例項唯一 現在來介紹四種方式 public class singletonpattern01 public static singletonpattern01 getsingletonpa...
單例模式的四種實現方式
單例模式 多次例項化的結果指向同一例項 一,單例模式實現方式一 import settings class mysql instance none def init self,ip,sport self.ip ip self.port port classmethod def from conf c...