單例模式:指的是在肯定 「類中的屬性與方法」 不變時,須要反覆調用該類,產生2不一樣的對象,而產生的對象會有不一樣的內存地址,會形成資源浪費,全部讓全部的類實例化時都指向同一個內存空間,稱爲單例模式python
優勢:節省內存空間mysql
單例模式有五種方法實現:sql
# 經過classmethod class MySQL: # 一個默認值,用於判斷對象是否存在, 對象不存在證實值是None # __instance是類的屬性,能夠由類來調用 __instance = None # ---》 執行到代碼obj = cls(host, port) ---》 obj # __instance = obj def __init__(self, host, port): self.host = host self.port = port @classmethod def singleton(cls, host, port): # 單例方法 ---》 類方法 # 判斷__instance中若沒有值,證實沒有對象 if not cls.__instance: # 產生一個對象並返回 obj = cls(host, port) # None ---> obj cls.__instance = obj # 若__instance中有值,證實對象已經存在,則直接返回該對象 return cls.__instance def start_mysql(self): print('啓動mysql') def close(self): print('關閉mysql') obj1 = MySQL.singleton('180.101.49.12', 443) print(obj1) # <__main__.MySQL object at 0x00000207EFC09188> obj2 = MySQL.singleton('180.101.49.12', 443) print(obj2) # <__main__.MySQL object at 0x00000207EFC09188>
class MySQL: __data = None def __init__(self): pass def __new__(cls, *args, **kwargs): if not cls.__data: cls.__data = object.__new__(cls) return cls.__data obj1 = MySQL() obj2 = MySQL() print(obj1) print(obj2)
類能夠做爲字典中的keycode
def mysql(cls): _date = {} def inner(*args, **kwargs): if cls not in _date: obj = cls(*args, **kwargs) _date[cls] = obj return _date[cls] return inner @mysql class Foo: def __init__(self): pass obj1 = Foo() obj2 = Foo() print(obj1) # <__main__.Foo object at 0x000002041ACBA448> print(obj2) # <__main__.Foo object at 0x000002041ACBA448>
#mysql模塊 class MySql: def __init__(self): pass obj = MySql()
from mysql import obj print(obj) # <mysql.MySql object at 0x000001FE6378CF48> # from mysql import obj print(obj) # <mysql.MySql object at 0x000001FE6378CF48>