1、什么是单例模式
单例模式:基于某种方法实例化多次得到实例是同一个
2、为何用单例模式
当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
3、如何用
实现单例的方式有3种:
1 import settings 2 3 class Mysql: 4 __instacne=None 5 6 def __init__(self,ip,port): 7 self.ip=ip 8 self.port=port 9 10 @classmethod 11 def from_conf(cls): 12 if cls.__instacne is None: 13 cls.__instacne=cls(settings.IP,settings.PORT) 14 return cls.__instacne 15 obj=Mysql('1.1.1.10',3306) 16 17 obj1=Mysql.from_conf() 18 obj2=Mysql.from_conf() 19 obj3=Mysql.from_conf() 20 21 print(obj1) 22 print(obj2) 23 print(obj3) 24 25 obj4=Mysql('10.10.10.11',3307)
1 import settings 2 def singleton(cls): 3 cls.__instance=cls(settings.IP,settings.PORT) 4 def wrapper(*args,**kwargs): 5 if len(args) == 0 and len(kwargs) == 0: 6 return cls.__instance 7 return cls(*args,**kwargs) 8 return wrapper 9 10 @singleton #Mysql=singleton(Mysql) #Mysql=wrapper 11 class Mysql: 12 def __init__(self,ip,port): 13 self.ip=ip 14 self.port=port 15 16 17 obj1=Mysql() #wrapper() 18 obj2=Mysql() #wrapper() 19 obj3=Mysql() #wrapper() 20 print(obj1 is obj2 is obj3) 21 print(obj1) 22 print(obj2) 23 print(obj3) 24 obj4=Mysql('1.1.1.4',3308) 25 print(obj4)
1 import settings 2 3 class Mymeta(type): 4 def __init__(self,class_name,class_bases,class_dic): #self=Mysql 5 super(Mymeta,self).__init__(class_name,class_bases,class_dic ) 6 self.__instance=self.__new__(self) #造出一个Mysql的对象 7 self.__init__(self.__instance,settings.IP,settings.PORT) #从配置文件中加载配置完成Mysql对象的初始化 8 9 # print(self.__instance) 10 # print(self.__instance.__dict__) 11 12 def __call__(self, *args, **kwargs): #self=Mysql 13 if len(args) == 0 and len(kwargs) == 0: 14 return self.__instance 15 16 obj=self.__new__(self) 17 self.__init__(obj,*args,**kwargs) 18 return obj 19 20 21 22 class Mysql(object,metaclass=Mymeta): #Mysql=Mymeta(...) 23 def __init__(self,ip,port): 24 self.ip=ip 25 self.port=port 26 27 28 obj1=Mysql() 29 obj2=Mysql() 30 obj3=Mysql() 31 obj4=Mysql('10.10.10.11',3308) 32 33 print(obj1) 34 print(obj2) 35 print(obj3) 36 print(obj4)