CSIC_716_20191129【 单例模式 的五种实现方式】
单例模式
单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。 让所有通过该类实例化出的对象,都指向同一个内存地址。
优点:节省内存空间。
单例模式有五种表现形式:
1.通过classmethod实现
2.通过__new__实现
3.通过导入模块时实现
4.通过装饰器实现
5.通过元类实现
1.通过classmethod实现
classmethod单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准
class Sun: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def single(cls, ip, port): if not cls.__instance: cls.__instance = cls(ip, port) return cls.__instance obj1 = Sun.single('192.168.1.1', 9090) obj2 = Sun.single('127.0.0.1', 8080) obj3 = Sun.single('255.255.255.0', 7070) print(obj3.ip) # 192.168.1.1 print(obj2.ip) # 192.168.1.1 print(obj1.ip) # 192.168.1.1
2.通过__new__实现
__new__单例开辟的空间中,最新的内容是最后一次被更新的。之前的对象统一以【最新】的为准.
class Sun: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port def __new__(cls, *args, **kwargs): # 此处传入的参数只和类相关,其他的。 if not cls.__instance: cls.__instance = object.__new__(cls) return cls.__instance obj1 = Sun('192.168.1.1', 9090) obj2 = Sun('127.0.0.1', 8080) obj3 = Sun('255.255.255.0', 7070) print(obj3.ip) # 255.255.255.0 print(obj2.ip) # 255.255.255.0 print(obj1.ip) # 255.255.255.0
3.通过元类实现单例模式
元类单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准
# _*_ coding: gbk _*_ # @Author: Wonder class Singleton(type): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 继承 self._instance = None # 派生 def __call__(self, *args, **kwargs): if not self._instance: self._instance = super().__call__(*args, **kwargs) return self._instance # 调用就返回 class MySQL(metaclass=Singleton): def __init__(self, host, port): self.host = host self.port = port obj1 = MySQL('192.168.1.1', 9090) obj2 = MySQL('127.0.0.1', 8080) obj3 = MySQL('255.255.255.0', 7070) print(obj1.host) # 192.168.1.1 print(obj2.host) # 192.168.1.1 print(obj3.host) # 192.168.1.1