什么是单例模式
基于某种实现方式,实例化产生的多个对象是同一个(指向同一个内存地址)--->以节省内存
实现方式一:通过类绑定方法
import setting class MySql: def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def get_conf(cls): if not hasattr(cls, '_%s__instance' % cls.__name__): cls.__instance = cls(setting.ip, setting.port) return cls.__instance obj1 = MySql.get_conf() obj2 = MySql.get_conf() obj3 = MySql('127.0.0.1', 8080) print(obj1) print(obj2) print(obj3) # 通过类绑定方法,如果从配置文件加载IP与port,实例化产生的对象都是同一个
实现方式二:通过装饰器
import setting def singleton(cls): _instance = cls(setting.ip, setting.port) # 这句不能放到wrapper函数内,原因:在解释@语法的时候就已经完成了这步,之后调用MySql都只是在调用wrapper def wrapper(*args, **kwargs): if args or kwargs: obj = cls(*args, **kwargs) return obj return _instance return wrapper @singleton class MySql: def __init__(self, ip, port): self.ip = ip self.port = port obj1 = MySql() obj2 = MySql() obj3 = MySql('10.1.1.1', 8080) print(obj1) print(obj2) print(obj3)
实现方式三:通过元类
import setting class MyType(type): def __init__(cls, class_name, class_bases, class_dic): super().__init__(class_name, class_bases, class_dic) cls.__instance = cls(setting.ip, setting.port) # cls.__instance = cls.__new__(cls) # cls.__init__(cls.__instance,setting.ip,setting.port) def __call__(cls, *args, **kwargs): if args or kwargs: obj = cls.__new__(cls) cls.__init__(obj, *args, **kwargs) return obj return cls.__instance class MySql(object, metaclass=MyType): def __init__(self, ip, port): self.ip = ip self.port = port obj1 = MySql() obj2 = MySql() obj3 = MySql('10.1.1.1', 8080) print(obj1) print(obj2) print(obj3)
实现方式四:根据导模块的特性
# 被导入的模块 import setting class MySql: def __init__(self,ip,port): self.ip = ip self.port = port instance_obj = MySql(setting.ip,setting.port) #执行文件 from singleton import MySql, instance_obj def f1(): return MySql('10.1.1.1', 8080) def f2(): return instance_obj obj1 = f1() obj2 = f2() obj3 = f2() print(obj1) print(obj2) print(obj3)