9.4 之单例模式

mac2022-06-30  93

9.4 之单例模式

单例模式定义:整个过程中只有一个实例,所有生成的实例都指向同一块内存空间

第一种:(类的绑定方法)

PORT = 3306 HOST = '127.0.0.1' class Sql: instance = None def __init__(self,port,host): self.port = port self.host = host @classmethod def get_sigo(cls): if not cls.instance: cls.flag = cls(PORT,HOST) return cls.instance #每次调用get_sigoleton 拿到的对象都是同一个 s1=Sql.get_si() s2=Sql.get_si() s3=Sql.get_si() s4=Sql('33306','192.168.1.1') print(s1) print(s2) print(s3) print(s4) ''' <__main__.Sql object at 0x02DF4030> <__main__.Sql object at 0x02DF4030> <__main__.Sql object at 0x02DF4030> <__main__.Sql object at 0x02DF4190> '''

第二种:(装饰器)

#当用户输入端口和地址,实例化产生新对象 #当用户不输入端口和地址,每次拿到的对象,都是同一个 PORT = 3306 HOST = '127.0.0.1' def get_sigo(func): instance = None def wrapper(*args,**kwargs): if len(args) != 0 or len(kwargs) != 0: #表示传了参数,生成新对象 res = func(*args,**kwargs) return res else: nonlocal instance if not instance: instance = func(PORT,HOST) return instance return wrapper @get_sigo class Sql: def __init__(self,port,host): self.port = port self.host = host s1=Sql() s2=Sql() s3=Sql('33306','192.168.1.1') s4=Sql('33306','192.168.1.1') print(s1) print(s2) print(s3) print(s4) ''' <__main__.Sql object at 0x036A41B0> <__main__.Sql object at 0x036A41B0> <__main__.Sql object at 0x036A41D0> <__main__.Sql object at 0x036A41F0> '''

第三种:(元类)

PORT = 3306 HOST = '127.0.0.1' class Mymeta(type): def __init__(self,name,bases,dic): # 把实例化好的对象,放到类的名称空间 self.instance = self(PORT,HOST) def __call__(self,*args,**kwargs): if len(args) != 0 or len(kwargs) != 0: obj = object.__new__(self) obj.__init__(*args,**kwargs) return obj else: return self.instance class Sql(metaclass = Mymeta): def __init__(self,port,host): self.port=port self.host=host print(Sql.__dict__) s1=Sql() s2=Sql() s3=Sql('33306','192.168.1.1') print(s1) print(s2) print(s3) ''' <__main__.Sql object at 0x034740D0> <__main__.Sql object at 0x034740D0> <__main__.Sql object at 0x03474050> '''

第四种:(模块导入)

# sigo 文件 # ************************************ PORT = 3306 HOST = '127.0.0.1' class Sql(): def __init__(self,port,host): self.port=port self.host=host s1=Sql(PORT,HOST) # ************************************ def test(): from sigo import s1 print(s1) def test2(): from sigo import s1 as s2 print(s2) test() test2() from sigo import s1 from sigo import Sql s2=Sql(3306,'192.168.1.1') print(s1) print(s2) ''' <sigonleton.Sql object at 0x03A46AB0> <sigonleton.Sql object at 0x03A46AB0> <sigonleton.Sql object at 0x03A46AB0> <sigonleton.Sql object at 0x03A22E30> '''

转载于:https://www.cnblogs.com/dadazunzhe/p/11461768.html

最新回复(0)