目录

* 一、什么是单例模式 <https://www.cnblogs.com/nickchen121/p/10272688.html#一什么是单例模式>
* 二、为什么用单例模式 <https://www.cnblogs.com/nickchen121/p/10272688.html#二为什么用单例模式>
* 三、单例模式(类内部定义静态方法)
<https://www.cnblogs.com/nickchen121/p/10272688.html#三单例模式类内部定义静态方法>
* 四、单例模式(装饰器) <https://www.cnblogs.com/nickchen121/p/10272688.html#四单例模式装饰器>
* 五、单例模式(元类) <https://www.cnblogs.com/nickchen121/p/10272688.html#五单例模式元类>
一、什么是单例模式

* 单例模式:基于某种方法实例化多次得到实例是同一个
二、为什么用单例模式

* 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例


三、单例模式(类内部定义静态方法)
# settings.py IP = '1.1.1.1' PORT = 3306 class Mysql: __instacne = None def
__init__(self, ip, port): self.ip = ip self.port = port @classmethod def
from_conf(cls): if cls.__instacne is None: cls.__instacne = cls(IP, PORT)
return cls.__instacne obj1 = Mysql.from_conf() obj2 = Mysql.from_conf() obj3 =
Mysql.from_conf() print(obj1 is obj2 is obj3) True print(obj1.__dict__)
print(obj2.__dict__) print(obj3.__dict__) {'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306} {'ip': '1.1.1.1', 'port': 3306} obj4 =
Mysql('10.10.10.11', 3307) print(obj4.__dict__) {'ip': '10.10.10.11', 'port':
3307}
四、单例模式(装饰器)
# settings.py IP = '1.1.1.1' PORT = 3306 def singleton(cls): cls.__instance =
cls(IP, PORT) def wrapper(*args, **kwargs): if len(args) == 0 and len(kwargs)
== 0: return cls.__instance return cls(*args, **kwargs) return wrapper
@singleton # Mysql = singleton(Mysql) # Mysql = wrapper class Mysql: def
__init__(self, ip, port): self.ip = ip self.port = port obj1 = Mysql() #
wrapper() obj2 = Mysql() # wrapper() obj3 = Mysql() # wrapper() print(obj1 is
obj2 is obj3) True print(obj1.__dict__) print(obj2.__dict__)
print(obj3.__dict__) {'ip': '1.1.1.1', 'port': 3306} {'ip': '1.1.1.1', 'port':
3306} {'ip': '1.1.1.1', 'port': 3306} obj4 = Mysql('1.1.1.4', 3308)
print(obj4.__dict__) {'ip': '1.1.1.4', 'port': 3308}
五、单例模式(元类)
# settings.py IP = '1.1.1.1' PORT = 3306 class Mymeta(type): def
__init__(self, class_name, class_bases, class_dic): # self = Mysql
super(Mymeta, self).__init__(class_name, class_bases, class_dic) #
完成Mysql对象的初始化 self.__instance = self.__new__(self) # 造出一个Mysql的对象
self.__init__(self.__instance, IP, PORT) # 从配置文件中加载配置完成Mysql对象的初始化
print(self.__instance) print(self.__instance.__dict__) def __call__(self,
*args, **kwargs): # self = Mysql 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): # Mysql = Mymeta(...) def
__init__(self, ip, port): self.ip = ip self.port = port obj1 = Mysql() obj2 =
Mysql() obj3 = Mysql() <__main__.Mysql object at 0x10c7f1f98> {'ip': '1.1.1.1',
'port': 3306} print(obj1 is obj2 is obj3) True print(obj1.__dict__)
print(obj2.__dict__) print(obj3.__dict__) {'ip': '1.1.1.1', 'port': 3306}
{'ip': '1.1.1.1', 'port': 3306} {'ip': '1.1.1.1', 'port': 3306} obj4 =
Mysql('10.10.10.11', 3308) print(obj4.__dict__) {'ip': '10.10.10.11', 'port':
3308} print(Mysql.__dict__) {'__module__': '__main__', '__init__': <function
Mysql.__init__ at 0x10c6b1d90>, '__dict__': <attribute '__dict__' of 'Mysql'
objects>, '__weakref__': <attribute '__weakref__' of 'Mysql' objects>,
'__doc__': None, '_Mymeta__instance': <__main__.Mysql object at 0x10c7f1f98>}

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信