zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器:在不改变原函数和原函数执行状态下,为函数增加功能

    万能装饰器:

    def wrapper(func):
        def inner():
            """执行函数之前的功能"""
            ret = func()
            """执行函数之后的功能"""
            return ret
        return inner
    @wrapper  #func = wrapper(func)
    def func():
        pass
    func()

     eval: 读取文本内容的时候,都是字符串,可以用eval转换一下,本身什么类型,就读出什么类型

    开放封闭原则:

    1、 对扩展是开放的

    2、 对修改是封闭的

    函数的有用信息:

    def f1():
        '''
        本函数的功能:绘图功能,实时接收数据并绘图.
        :return: 绘图需要的数据,返回给前端某标签
        '''
        print(f1.__doc__)            #打印注释
        print(f1.__name__)         #打印函数名字
    f1()
    #输出:

          本函数的功能:绘图功能,实时接收数据并绘图.
          :return: 绘图需要的数据,返回给前端某标签

              f1

    有装饰器的情况下打印有用信息:

    rom functools import wraps
    def wrapper(func):
        @wraps(func)
        def inner(*args,**kwargs):
            '''执行函数前进行的操作'''
            ret = func(*args,**kwargs)
            '''执行函数后进行的操作'''
            return ret
        return inner
    
    @wrapper
    def f1():
        '''
        本函数的功能:绘图功能,实时接收数据并绘图.
        :return: 绘图需要的数据,返回给前端某标签
        '''
        print(f1.__doc__)
        print(f1.__name__)
    f1()

    *args 和**kwargs:

    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前'''
            ret = func(*args,**kwargs)
            '''执行函数后'''
            return ret
        return inner
    
    @wrapper
    def func(a,b,c,d):      #接收函数时,加个*聚合
        print(111)    
    func(1,2,3,4)
    
    # f1(*[1,2,3,4])        #执行函数时,加个*打散

    带参数的装饰器:

     可以当作装饰器的开关

    import time
    flag = True                             #flag = True  则装饰,flag = Flag  则不装饰,只执行原函数 
    def timmer(f):
        def wrapper(func):
            def inner(*args,**kwargs):
                if f:
                    start_time = time.time()
                    ret = func(*args,**kwargs)
                    end_time = time.time()
                    print(end_time - start_time)
                    return ret
                else:
                    ret = func(*args, **kwargs)
                    return ret
            return inner
        return wrapper
    @timmer(flag)
    def func():
        print(123)
    func()

    一个装饰器装饰多个函数:

    def wrapper1(func):
        def inner1(*args,**kwargs):
            print(1)
            ret=func(*args,**kwargs)
            print(2)
            return ret
        return inner1
    def wrapper2(func):
        def inner2(*args,**kwargs):
            print(3)
            ret=func(*args,**kwargs)
            print(4)
            return ret
        return inner2
    
    @wrapper1
    @wrapper2
    def func():
        print(5)
    func()
    #输出:1   3   5   4    2
  • 相关阅读:
    JUnit5依赖注入与测试接口
    Python如何设计面向对象的类(下)
    JUnit5参数化测试的几种方式
    JUnit5的条件测试、嵌套测试、重复测试
    熬夜肝了一份 C++/Linux 开发学习路线
    适合普通大学生的 Java 后端开发学习路线
    二本,拿腾讯,阿里 offer 了
    适合普通大学生的前端学习路线
    41道计算机网络高频面试题(附带答案)
    在Rancher中修改K8S服务参数的万金油法则
  • 原文地址:https://www.cnblogs.com/pygg/p/8418773.html
Copyright © 2011-2022 走看看