#方式一:定義乙個類方法實現單例模式
import settings
class mysql:
__instance=none
def __init__(self,host,port):
self.host=host
self.port=port
@classmethod
def singleton(cls):
if not cls.__instance:
cls.__instance=cls(settings.host,settings.port)
return cls.__instance
obj1=mysql('1.1.1.2',3306)
obj2=mysql('1.1.1.3',3307)
print(obj1 is obj2) #false
obj3=mysql.singleton()
obj4=mysql.singleton()
print(obj3 is obj4) #true
#方式二:定製元類實現單例模式
import settings
class mymeta(type):
def __init__(self,name,bases,dic): #定義類mysql時就觸發
# 事先先從配置檔案中取配置來造乙個mysql的例項出來
self.__instance = object.__new__(self) # 產生物件
self.__init__(self.__instance, settings.host, settings.port) # 初始化物件
# 上述兩步可以合成下面一步
# self.__instance=super().__call__(*args,**kwargs)
super().__init__(name,bases,dic)
def __call__(self, *args, **kwargs): #mysql(...)時觸發
if args or kwargs: # args或kwargs內有值
obj=object.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
return self.__instance
class mysql(metaclass=mymeta):
def __init__(self,host,port):
self.host=host
self.port=port##
obj1=mysql() # 沒有傳值則預設從配置檔案中讀配置來例項化,所有的例項應該指向乙個記憶體位址
obj2=mysql()
obj3=mysql()
print(obj1 is obj2 is obj3)
obj4=mysql('1.1.1.4',3307)
print(obj1 is obj4)
# 方式三:定義乙個裝飾器實現單例模式
import settings
def singleton(cls): #cls=mysql
_instance=cls(settings.host,settings.port)
if args or kwargs:
obj=cls(*args,**kwargs)
return obj
return _instance
@singleton # mysql=singleton(mysql)
class mysql:
def __init__(self,host,port):
self.host=host
self.port=port
obj1=mysql()
obj2=mysql()
obj3=mysql()
print(obj1 is obj2 is obj3) #true
obj4=mysql('1.1.1.3',3307)
obj5=mysql('1.1.1.4',3308)
print(obj3 is obj4) #fals
(三)單例模式
這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單 一 獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件 皇帝 中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在...
(三)單例模式
這個模式是很有意思,而且比較簡單,但是我還是要說因為它使用的是如此的廣泛,如此的有人緣,單例就是單 一 獨苗的意思,那什麼是獨乙份呢?你的思維是獨乙份,除此之外還有什麼不能山寨的呢?我們舉個比較難複製的物件 皇帝 中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在...
python單例模式繼承 python單例模式
我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...