• 单例模式


    单例模式:多次实例化的结果指向同一个实例
    单例模式的作用:减少内存空间的使用

    实现单例模式的四种方式

    方式一: 通过调用类方法

    class Mysql:
        _instance = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def form_conf(cls):
            if not cls._instance:
                cls._instance = cls("1.1.1.1", 3306)
            return cls._instance


    方式二:通过装饰器

    def single(cls):
        _instance = cls("1.1.1.1", 3306)
    
        def wrapper(*args, **kwargs):
            if args or kwargs:
                instance = cls(*args, **kwargs)
                return instance
            else:
                return _instance
    
        return wrapper
    
    
    @single
    class Mysql:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port


    方式三:通过元类

    class Meta(type):
        def __init__(self, class_name, class_bases, class_dic):
            self.class_name = class_name
            self.class_bases = class_bases
            self.class_dic = class_dic
            self._instance = self("1.1.1.1", 3306)
    
        def __call__(self, *args, **kwargs):
            if args or kwargs:
                obj = self.__new__(self)
                self.__init__(obj, *args, **kwargs)
                return obj
            else:
                return self._instance
    
    
    class Mysql(metaclass=Meta):
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port


    方式四:通过模块

    模块代码

    class Mysql:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    instance = Mysql("1.1.1.1", 3306)

    执行代码

    def f2():
        from single import instance
        print(instance)
    
    
    def f3():
        from single import instance
        print(instance)
    
    
    def f4():
        from single import Mysql
        instance = Mysql("1.1.1.2", 3302)
        print(instance)
    
    f1()
    f2()
    f3()
    f4()
  • 相关阅读:
    34. 在排序数组中查找元素的第一个和最后一个位置
    153. 寻找旋转排序数组中的最小值
    278. 第一个错误的版本
    540. 有序数组中的单一元素
    744. 寻找比目标字母大的最小字母
    69. x 的平方根
    763. 划分字母区间
    53. 最大子序和
    665. 非递减数列
    Zabbix探索:Agent配置中Hostname错误引起的Agent.Ping报错
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9548801.html
Copyright © 2020-2023  润新知