色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

python 實現單例模式的5種方法

瀏覽:4日期:2022-07-10 10:21:09

一、classmethod裝飾器

# 全局變量ip = ’192.168.13.98’port = ’3306’class MySQL: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def instance(cls, *args, **kwargs): if args or kwargs: cls.__instance = cls(*args, **kwargs) return cls.__instance obj1 = MySQL.instance(ip, port)obj2 = MySQL.instance()obj3 = MySQL.instance()print(obj1)print(obj2, obj2.__dict__)print(obj3, obj3.__dict__)

輸出結果

<main.MySQL object at 0x058D6F30><main.MySQL object at 0x058D6F30> {’ip’: ’192.168.13.98’, ’port’: ’3306’}<main.MySQL object at 0x058D6F30> {’ip’: ’192.168.13.98’, ’port’: ’3306’}

二、類的裝飾器

def singlegon(cls): _instance = cls(ip, port) def wrapper(*args, **kwargs): if args or kwargs: return cls(*args, **kwargs) return _instance return wrapper @singlegonclass MySQL1: def __init__(self, ip, port): self.ip = ip self.port = port obj1 = MySQL1()obj2 = MySQL1()obj3 = MySQL1(’1.1.1.3’, 8080)print(obj1)print(obj2, obj2.__dict__)print(obj3, obj3.__dict__)

運行結果

<main.MySQL1 object at 0x04C102B0><main.MySQL1 object at 0x04C102B0> {’ip’: ’192.168.13.98’, ’port’: ’3306’}<main.MySQL1 object at 0x04C10310> {’ip’: ’1.1.1.3’, ’port’: 8080}

三、元類

class Mymetaclass(type): def __init__(self, class_name, class_bases, class_dic): super().__init__(class_name, class_bases, class_dic) self.__instance = self(ip, port) def __call__(self, *args, **kwargs): if args or kwargs: obj = self.__new__(self) self.__init__(obj, *args, **kwargs) self.__instance = obj return self.__instance class MySQL2(metaclass=Mymetaclass): def __init__(self, ip, port): self.ip = ip self.port = port obj1 = MySQL2()obj2 = MySQL2()obj3 = MySQL2(’1.1.1.3’, 80)print(obj1)print(obj2, obj2.__dict__)print(obj3, obj3.__dict__)

運行結果

<main.MySQL2 object at 0x04D003B0><main.MySQL2 object at 0x04D003B0> {’ip’: ’192.168.13.98’, ’port’: ’3306’}<main.MySQL2 object at 0x04D003D0> {’ip’: ’1.1.1.3’, ’port’: 80}

四、模塊導入

# instance.py class MySQL: def __init__(self, ip, port): self.ip = ip self.port = port ip = ’192.168.13.98’port = 3306instance = MySQL(ip, port) # 測試代碼import os, sys sys.path.append(os.path.dirname(os.path.dirname(__file__)))from test import instance obj1 = instance.instanceobj2 = instance.instanceobj3 = instance.MySQL(’1.1.1.3’, 80)print(obj1)print(obj2, obj2.__dict__)print(obj3, obj3.__dict__)

運行結果

<day30.instance.MySQL object at 0x052B0AB0><day30.instance.MySQL object at 0x052B0AB0> {’ip’: ’192.168.13.98’, ’port’: 3306}<day30.instance.MySQL object at 0x052B03F0> {’ip’: ’1.1.1.3’, ’port’: 80}

五、重寫__new__()

class MySQL3(object): __instance = None __first_init = True def __init__(self, ip, port): if self.__first_init: self.ip = ip self.port = port self.__first_init = False def __new__(cls, *args, **kwargs): if not cls.__instance: cls.__instance = object.__new__(cls) return cls.__instance obj1 = MySQL3(ip, port)obj2 = MySQL3(ip, port)obj3 = MySQL3(’1.1.1.3’, 80)print(obj1)print(obj2, obj2.__dict__)print(obj3, obj3.__dict__)

運行結果

<main.MySQL3 object at 0x059603F0><main.MySQL3 object at 0x059603F0> {’ip’: ’192.168.13.98’, ’port’: ’3306’, ’_MySQL3__first_init’: False}<main.MySQL3 object at 0x059603F0> {’ip’: ’192.168.13.98’, ’port’: ’3306’, ’_MySQL3__first_init’: False}

注:前四種可以實現單例模式,但都不是絕對單例模式,可以創建新的對象,但是第五種方式是絕對單例模式,全局只能真正創建一次對象

以上就是python 實現單例模式的5種方法的詳細內容,更多關于python 單例模式的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 97视频免费播放观看在线视频 | 日韩a毛片 | 欧美激情亚洲一区中文字幕 | 精品久久久中文字幕二区 | 久久亚洲欧洲日产国码 | 国产高清一区二区三区四区 | 欧美精品一区二区三区在线 | 人成18亚洲资源在线 | ccyycom草草影院成人91 | 国产亚洲毛片在线 | 国产欧美另类久久久精品免费 | 性欧美视频a毛片在线播放 性欧美一级 | 美国一级免费毛片 | 亚洲国产成a人v在线观看 | 99精品99| 欧美成人专区 | 亚洲国产精品一区二区九九 | 欧美一区二区在线观看 | 久久精品国产99国产精品亚洲 | 亚洲成av人片在线观看 | 欧美视频不卡 | 国产片久久 | 一级毛片一级毛片a毛片欧美 | 亚洲深夜视频 | 欧美日韩视频精品一区二区 | 久久ri精品高清一区二区三区 | 57pao强力打造手机版 | 波多野吉衣 免费一区 | 免费a级毛片大学生免费观看 | 成人国产精品一级毛片了 | 男人女人做性全程视视频 | 国产成人精品午夜二三区 | 国产免费一区二区三区免费视频 | 成年美女黄网站色视频大全免费 | 成人交性视频免费看 | 丰满寡妇一级毛片 | 俄罗斯美女在线观看一区 | 成人午夜影院在线观看 | 有码一区| 欧美亚洲一区二区三区在线 | 欧美日韩在线播放一区二区三区 |