單例模式:sql
什麼是單例模式?spa
基於某種方法實例化屢次獲得實例是同一個code
實現方法:blog
ip = '1.1.1.1' port = 3306 # 僞裝來自配置文件 #方法一:定義類方法進行判斷 class Mysql: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def from_settings(cls): if not cls.__instance: cls.__instance = cls(ip, port) return cls.__instance p1 = Mysql.from_settings() p2 = Mysql.from_settings() p3 = Mysql.from_settings() p4 = Mysql('1.1.3.2',2203) print(p1 is p2 is p3) # Ture print(p1) print(p4)
#方法二:使用裝飾器
def single(cls):
_instance = cls(ip, port) def inner(*args, **kwargs): if len(args) + len(kwargs) == 0: return _instance return cls(*args, **kwargs) return inner @single class Mysql: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port p1 = Mysql() p2 = Mysql() p3 = Mysql() p4 = Mysql('1.1.3.2',2203) print(p1 is p2 is p3) # True print(p1) print(p4)
方法三:使用元類控制
class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): super().__init__(class_name,class_bases,class_dic) self.__instance = self.__new__(self) self.__init__(self.__instance,ip,port) def __call__(self, *args, **kwargs): if len(args) + len(kwargs) == 0: return self.__instance obj = self.__new__(self) self.__init__(obj,*args,**kwargs) return objclass Mysql(object,metaclass=Mymeta): __instance = None def __init__(self, ip, port): self.ip = ip self.port = portp1 = Mysql()p2 = Mysql()p3 = Mysql()p4 = Mysql('1.1.3.2',2203)print(p1 is p2 is p3) # Trueprint(p1)print(p4)