zoukankan      html  css  js  c++  java
  • 装饰器和单例模式

    1,通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,那么就会变成一个单例模式的类

    解释:这个类被装饰器装饰完之后,这个类变指向了装饰器的内层函数fun,那么再通过

    t1 = MyTest()并没有创建对象,而是调用了函数t1 = fun(),那么对象只能在装饰器内部实现并赋值给t1
    def single(cls):
      # 不建议用列表,因为不确定返回哪个对象
      # 使用私有属性更安全,公有属性在外部可以被任意改值 __instance
    = {}

    def fun(*args, **kwargs): if cls in __instance: return __instance[cls] else:
           # 如果类不在字典中,通过cls创建类的实例对象并添加到这个instance字典中(cls是指向这个类的) __instance[cls]
    = cls(*args, **kwargs) return __instance[cls] return fun @single # MyTest = single(MyTest) class MyTest: pass @single class Test: pass

    t1 = MyTest()

    2,通过类实现一个通用的装饰器,既可以装饰函数 也可以装饰类,既可以装饰有参数的 也可以装饰无参数的

    class Decorator:
        
        def __init__(self, func):
            self.func = func
            
        def __call__(self, *args, **kwargs):
            print('这个是装饰器里面的功能')
            self.func()
            
    @Decorator  # test = Decorator(test) 该方法被装饰完之后就生成了一个对象,那么对象如何被调用呢?通过__call__方法
    def test_01(): print('--被装饰的函数--') test_01()
  • 相关阅读:
    php---观察者模式
    elasticsearch常用查询和注意点
    linux镜像iso格式
    Mysql查询今天、昨天、7天、近30天、本月、上一月数据
    php常用算法
    算法之斐波纳契数列递归和迭代实现
    带你了解session和cookie作用原理区别和用法
    mysql大数据量的分页优化
    常用链接
    自然语言处理
  • 原文地址:https://www.cnblogs.com/ella-li/p/14164238.html
Copyright © 2011-2022 走看看