单例模式

单例模式

单例模式:指的是在确定 “类中的属性与方法” 不变时,需要反复调用该类,产生2不同的对象,而产生的对象会有不同的内存地址,会造成资源浪费,所有让所有的类实例化时都指向同一个内存空间,称为单例模式

优点:节省内存空间

单例模式有五种方法实现:

  1. 通过classmethod
  2. 通过__ new__来实现
  3. 通过装饰器实现
  4. 通过导入模块实现
  5. 通过元类实现

1、通过classmethod

# 通过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>

2、通过__ new__来实现

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)

3、通过装饰器实现

类可以作为字典中的key

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>

4、通过导入模块实现

#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>
posted @ 2019-11-29 19:22  Mr沈  阅读(152)  评论(0编辑  收藏  举报