1、什么是单例模式
单例模式:基于某种方法实列化多次得到的实例是同一个
2、为何用单例模式
当实例化多次得到的对象中存放的属性都一样的情况下,应该将多个对象指向同一个内存,即同一个实例(实例化同样的对象,通过单例模式,可以降低内存的暂用)
3、如何用
方式一、
import setting class Mysql: __instacne=None def __init__(self,ip,port): self.ip=ip self.port=port @classmethod def from_conf(cls):#利用判断的模式可以将相同内容的ID指向同一个内存,从而减少内存空间 if cls.__instacne is None: cls.__instacne=cls(setting.IP,setting.PORT)#必须要赋值 return cls.__instacne#return 在if处表示不管__instacne是否是None都能调用 def co(self): print("IP:%s PORT:%s" %(self.ip,self.port)) obj1=Mysql.from_conf() obj2=Mysql.from_conf() obj3=Mysql.from_conf() print(obj1) print(obj2) print(obj3) obj4=Mysql("10.10.10.10",3307) print(obj4) obj1.co()

def singleten(cls):#cls=Mysql _instance=cls(setting.IP,setting.PORT) def wrapper(*args,**kwargs):#Mysql()重复调用wrapper if len(args)==0 and len(kwargs)==0: return _instance#在没有传参的情况下,一直是使用默认的内存空间内的内容 return cls(*args,**kwargs)#在传参的情况下就直接全部返回给类 return wrapper @singleten class Mysql: def __init__(self,ip,port): self.ip=ip self.port=port obj=Mysql()#Mysql的调用是一直是wrapper() obj2=Mysql() print(obj is obj1) obj2=Mysql("1.1.12.3",3309) print(obj2)

class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): super(Mymeta,self).__init__(class_name,class_bases,class_dic) self.__instance=self.__new__(self) self.__init__(self.__instance,setting.IP,setting.PORT) def __call__(self,*args,**kwargs): if len(args)==0 and len(kwargs)==0: return self.__instance obj = self.__new__(self) self.__init__(obj,*args,**kwargs) return obj class Mysql(object,metaclass=Mymeta): def __init__(self,ip,port): self.ip=ip self.port=port