python中单例模式的四种实现方式
配置文件settings.py
IP='100.0.0.2' PORT=3302
方式一:绑定给类的方法
class Mysql: __instance = None def __init__(self, ip, port): self.ip = ip self.port = port @classmethod def from_conf(cls): if cls.__instance is None: cls.__instance = cls(settings.IP, settings.PORT) return cls.__instance obj1 = Mysql.from_conf() obj2 = Mysql.from_conf() obj3 = Mysql.from_conf() obj = Mysql('1.1.1.0', 3302) print(obj) print(obj1) print(obj2) print(obj3)
方式二:装饰器
def singleton(cls): # 先造好一个空对象 instance = cls(settings.IP, settings.PORT) def wrapper(*args, **kwargs): if args or kwargs: # args 和 kwargs 有值时,返回obj obj = cls(*args, **kwargs) return obj return instance return wrapper @singleton class Mysql: # Mysql = singleton(Mysql) def __init__(self, ip, port): self.ip = ip self.port = port obj1 = Mysql() # wrapper() obj2 = Mysql() obj3 = Mysql() obj4 = Mysql('1.1.1.2', 3303) print(obj1) print(obj2) print(obj3) print(obj4)
方式三:自定义元类
class Mymeta(type): def __init__(self, class_name, class_base, class_dic): # 先造好一个空对象 self.instance = self(settings.IP, settings.PORT) def __call__(self, *args, **kwargs): if args or kwargs: # 拿到一个空对象 obj = self.__new__(self) # 执行__init__方法为对象初始化属性 self.__init__(obj, *args, **kwargs) # 返回一个实例化好的对象 return obj return self.instance class Mysql(metaclass=Mymeta): def __init__(self, ip, port): self.ip = ip self.port = port obj1 = Mysql() # 调用Mysql就是调用__call__方法 obj2 = Mysql() obj3 = Mysql() obj4 = Mysql('1.1.1.4', 3301) print(obj1) print(obj2) print(obj3) print(obj4)
方式四:利用模块的导入特性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import settings class Mysql: def __init__(self, ip, port): self.ip = ip self.port = port instance = Mysql(settings.IP,settings.PORT)
def f1(): from singleton import instance print(instance) def f2(): from singleton import instance, Mysql print(instance) obj = Mysql('1.1.1.0', 3303) print(obj) f1() f2()
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10578676.html
作者:cnblogs用户