單例模式

單例模式

單例模式:指的是在肯定 「類中的屬性與方法」 不變時,須要反覆調用該類,產生2不一樣的對象,而產生的對象會有不一樣的內存地址,會形成資源浪費,全部讓全部的類實例化時都指向同一個內存空間,稱爲單例模式python

優勢:節省內存空間mysql

單例模式有五種方法實現:sql

  1. 經過classmethod
  2. 經過__ new__來實現
  3. 經過裝飾器實現
  4. 經過導入模塊實現
  5. 經過元類實現

一、經過classmethod

# 經過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>

二、經過__ new__來實現

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>
相關文章
相關標籤/搜索