zoukankan      html  css  js  c++  java
  • python中单例模式的四种实现方式

    配置文件settings.py

    IP='100.0.0.2'
    PORT=3302

    方式一:绑定给类的方法

    class Mysql:
        __instance = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def from_conf(cls):
            if cls.__instance is None:
                cls.__instance = cls(settings.IP, settings.PORT)
            return cls.__instance
    
    
    obj1 = Mysql.from_conf()
    obj2 = Mysql.from_conf()
    obj3 = Mysql.from_conf()
    obj = Mysql('1.1.1.0', 3302)
    print(obj)
    print(obj1)
    print(obj2)
    print(obj3)

    方式二:装饰器

    def singleton(cls):
        # 先造好一个空对象
        instance = cls(settings.IP, settings.PORT)
    
        def wrapper(*args, **kwargs):
            if args or kwargs:  # args 和 kwargs 有值时,返回obj
                obj = cls(*args, **kwargs)
                return obj
            return instance
    
        return wrapper
    
    
    @singleton
    class Mysql:    # Mysql = singleton(Mysql)
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    obj1 = Mysql()  # wrapper()
    obj2 = Mysql()
    obj3 = Mysql()
    obj4 = Mysql('1.1.1.2', 3303)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    方式三:自定义元类

    class Mymeta(type):
        def __init__(self, class_name, class_base, class_dic):
            # 先造好一个空对象
            self.instance = self(settings.IP, settings.PORT)
    
        def __call__(self, *args, **kwargs):
            if args or kwargs:
                # 拿到一个空对象
                obj = self.__new__(self)
    
                # 执行__init__方法为对象初始化属性
                self.__init__(obj, *args, **kwargs)
    
                # 返回一个实例化好的对象
                return obj
            return self.instance
    
    
    class Mysql(metaclass=Mymeta):
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    obj1 = Mysql()  # 调用Mysql就是调用__call__方法
    obj2 = Mysql()
    obj3 = Mysql()
    obj4 = Mysql('1.1.1.4', 3301)
    print(obj1)
    print(obj2)
    print(obj3)
    print(obj4)

    方式四:利用模块的导入特性

    import settings
    
    class Mysql:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    
    instance = Mysql(settings.IP,settings.PORT)
    singleton.py
    def f1():
        from singleton import instance
        print(instance)
    
    
    def f2():
        from singleton import instance, Mysql
        print(instance)
        obj = Mysql('1.1.1.0', 3303)
        print(obj)
    
    
    f1()
    f2()
  • 相关阅读:
    文件打包下载
    DES加密解密
    jQuery实现表格拖动排序
    jQuery实现星星评分功能
    问卷调查功能中的题目编辑功能
    使用JS或jQuery模拟鼠标点击a标签事件
    zTree的使用
    给文本框添加模糊搜索功能(“我记录”MVC框架下实现)
    表达式计算器的实现
    asp.net几种开源上传控件,flash,ajax版,支持多文件
  • 原文地址:https://www.cnblogs.com/rongge95500/p/10578676.html
Copyright © 2011-2022 走看看