(python)三個單例模式

2021-08-19 00:05:54 字數 2101 閱讀 3322

#方式一:定義乙個類方法實現單例模式

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...