单例模式:指的是在肯定 “类中的属性与方法” 不变时,须要反复调用该类,产生2不一样的对象,而产生的对象会有不一样的内存地址,会形成资源浪费,全部让全部的类实例化时都指向同一个内存空间,称为单例模式python
优势:节省内存空间mysql
单例模式有五种方法实现:sql
# 经过classmethod class MySQL: # 一个默认值,用于判断对象是否存在, 对象不存在证实值是None # __instance是类的属性,能够由类来调用 __instance = None # ---》 执行到代码obj = cls(host, port) ---》 obj # __instance = obj def __init__(self, host, port): self.host = host self.port = port @classmethod def singleton(cls, host, port): # 单例方法 ---》 类方法 # 判断__instance中若没有值,证实没有对象 if not cls.__instance: # 产生一个对象并返回 obj = cls(host, port) # None ---> obj cls.__instance = obj # 若__instance中有值,证实对象已经存在,则直接返回该对象 return cls.__instance def start_mysql(self): print('启动mysql') def close(self): print('关闭mysql') obj1 = MySQL.singleton('180.101.49.12', 443) print(obj1) # <__main__.MySQL object at 0x00000207EFC09188> obj2 = MySQL.singleton('180.101.49.12', 443) print(obj2) # <__main__.MySQL object at 0x00000207EFC09188>
class MySQL: __data = None def __init__(self): pass def __new__(cls, *args, **kwargs): if not cls.__data: cls.__data = object.__new__(cls) return cls.__data obj1 = MySQL() obj2 = MySQL() print(obj1) print(obj2)
类能够做为字典中的keycode
def mysql(cls): _date = {} def inner(*args, **kwargs): if cls not in _date: obj = cls(*args, **kwargs) _date[cls] = obj return _date[cls] return inner @mysql class Foo: def __init__(self): pass obj1 = Foo() obj2 = Foo() print(obj1) # <__main__.Foo object at 0x000002041ACBA448> print(obj2) # <__main__.Foo object at 0x000002041ACBA448>
#mysql模块 class MySql: def __init__(self): pass obj = MySql()
from mysql import obj print(obj) # <mysql.MySql object at 0x000001FE6378CF48> # from mysql import obj print(obj) # <mysql.MySql object at 0x000001FE6378CF48>