单例模式的三种实现方式

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
方式三
原文地址:https://www.cnblogs.com/yf18767106368/p/9254382.html