• 面向对象——单例模式,五种方式


    单例模式:多次实例化的结果指向同一个实例

    实现方式 一、使用类方法(调用创新对象,函数返回原定对象)
    import settings
    class Mysql:
        __instance = None
    
        def __init__(self, host, port):
            self.host = host
            self.port = port
    
        @classmethod
        def singleton(cls):
            if not cls.__instance:
                # 创建类实例存入局部空间
                cls.__instance = cls(settings.IP, settings.PORT)
            return cls.__instance
    
    
    # 使用init创建实例
    obj1 = Mysql('1.1.1.2', 3306)
    obj2 = Mysql('1.1.1.3', 3307)
    print(obj1 is obj2)  # False
    
    # 使用类方法创建实例
    obj3 = Mysql.singleton()
    obj4 = Mysql.singleton()
    print(obj3 is obj4)  # True
    
    实现方式 二、定义装饰器(有参创建新对象,无参返回原对象)
    import settings
    
    def singleton(cls):
        _instance=cls(settings.IP,settings.PORT)
        def wrapper(*args,**kwargs):
            if len(args) !=0 or len(kwargs) !=0:
                obj=cls(*args,**kwargs)
                return obj
            return _instance
        return wrapper
    
    @singleton #MySQL=singleton(MySQL) #MySQL=wrapper
    class MySQL:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    # obj=MySQL('1.1.1.1',3306) #obj=wrapper('1.1.1.1',3306)
    # print(obj.__dict__)
    
    obj1=MySQL() #wrapper()
    obj2=MySQL() #wrapper()
    obj3=MySQL() #wrapper()
    obj4=MySQL('1.1.1.3',3302) #wrapper('1.1.1.3',3302)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)
    实现方式 三、元类实现(有参创建新对象,无参返回原对象)
    import settings
    
    class Mymeta(type):
        def __init__(self,class_name,class_bases,class_dic):
            #self=MySQL这个类
            self.__instance=self(settings.IP,settings.PORT)
    
        def __call__(self, *args, **kwargs):
            # self=MySQL这个类
            if len(args) != 0 or len(kwargs) != 0:
                obj=self.__new__(self)
                self.__init__(obj,*args, **kwargs)
                return obj
            else:
                return self.__instance
    
    class MySQL(metaclass=Mymeta): #MySQL=Mymeta(...)
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    obj1=MySQL()
    obj2=MySQL()
    obj3=MySQL()
    obj4=MySQL('1.1.1.3',3302)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)
    实现方式 四、模块实现

    配置文件settings

    IP = '192.168.1.1'
    PORT = 3306

    -模块文件 singleton

    import settings
    
    
    class MySQL:
        print('run....')
    
        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.3',3302)
        print(obj)
    f1()
    f2()
    
  • 相关阅读:
    bash 中有效建立锁
    go 语言 Makefile 指定依赖包位置
    在 mysql 中对特定的库禁用 DDL 语句
    go 语言并发机制 goroutine 初探
    Google和facebook如何应用R进行数据挖掘
    数据应用催生商业模式
    4款语音播报来电短信应用[Android]
    让 php 用 nginx 打包 zip
    10个关于 Dropbox 的另类功用(知乎问答精编)[还是转来了]
    分析以数据挖掘技术预测用户流失情况的方法
  • 原文地址:https://www.cnblogs.com/king-home/p/10793195.html
Copyright © 2020-2023  润新知