zoukankan      html  css  js  c++  java
  • 面向对象——单例模式,五种方式

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

    实现方式 一、使用类方法(调用创新对象,函数返回原定对象)
    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()
    
  • 相关阅读:
    [ 原创 ] Oracle存储过程中使用游标进行多行数据输出
    [ 原创 ] Python解压版安装配置教程
    [ 转载 ] ORACLE存储过程
    [ 转载 ] Oracle存储过程及函数的练习题
    [ 原创 ] Oracle数据库一些基本命令
    [ 转载 ] Linux CentOS 查看操作系统版本信息
    [ 转载 ] Android开发中如何做单元测试
    [ 转载 ] 关于conn /as sysdba 无需密码直接可以连接的疑问
    [ 转载 ] oracle如何查看当前有哪些用户连接到数据库
    [ 转载 ] Oracle 内存(SGA,PGA)详细介绍
  • 原文地址:https://www.cnblogs.com/king-home/p/10793195.html
Copyright © 2011-2022 走看看