zoukankan      html  css  js  c++  java
  • 函数之装饰器

    装饰器的本质:闭包函数

    装饰器的功能:就是在不改变原函数调用方式的情况下,在这个函数的前后加上扩展功能

    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    
    @timer
    def func1(a):
        print(a)
    
    func1(1)
    带参数的装饰器

    装饰器的开放封闭原则:

            1、对扩展是开放的

            2、对修改是封闭的

    装饰器的主要功能:就是在不改变函数调用方式的基础上在函数前、后添加功能

    装饰器的固定方式

    def timer(func):
        def inner(*args,**kwargs):
            '''执行函数之前要做的'''
            re = func(*args,**kwargs)
            '''执行函数之后要做的'''
            return re
        return inner
    装饰器的固定方式

    带参数的装饰器 

    F = False
    def outer(flag):
        def wrapper(func):
            def inner(*args,**kwargs):
                if flag:
                    print('before')
                    ret = func(*args,**kwargs)
                    print('after')
                else:
                    ret = func(*args, **kwargs)
                return ret
            return inner
        return wrapper
    
    @outer(F)  #-->@wrapper  -->hahaha = wrapper(hahaha)  #-->hahaha == inner
    def hahaha():
        print('hahaha')
    
    @outer(F)   #shuangww = outer(shuangww)
    def shuangww():
        print('shuangwaiwai')
    
    shuangww()
    hahaha()
    带参数装饰器开关

    多个装饰器装饰一个函数

    def qqxing(func):  #func = pipixia_inner
        def qqxing_inner(*args,**kwargs):
            print('in qqxing:before')
            ret = func(*args,**kwargs)  #pipixia_inner
            print('in qqxing:after')
            return ret
        return qqxing_inner
    
    def pipixia(func):  #dapangxie
        def pipixia_inner(*args,**kwargs):
            print('in pipixia:before')
            ret = func(*args,**kwargs)      #dapangxie
            print('in pipixia:after')
            return ret
        return pipixia_inner
    
    #qqxing(pipixia_inner)  -->dapangxie = qqxing_inner()
    @qqxing    #dapangxie = qqxing(dapangxie)  -->dapangxie = qqxing(pipixia(dapangxie)) -->
    @pipixia   #dapangxie = pipixia(dapangxie)
    def dapangxie():
        print("饿了么")
    dapangxie()
    多个装饰器装饰一个函数

    多个装饰器应用场景:

       1.计算func的执行时间 @timmer
    2.登录认证 #@auth

    补充:
    解耦  尽量的让代码分离。小功能之间的分离
    解耦的目的 提高代码的重用性

              

  • 相关阅读:
    linux系统中将一列数据转换为若干列数据(列的顺序不变)
    linux系统中将矩形数据转换为一行、一列的形式
    linux系统中实现文本转置。
    linux shell 如何将多列数据变为一行数据
    linux系统中如何将一行数据变为一列
    bash: unlzma: command not found...
    linux系统中实现对行的批量替换
    linux系统中对指定行的字符串进行替换
    linux系统中对指定列的数据中的字符串进行替换
    linux系统中如何将每行特定数目字符后的字符替换为指定字符
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/7245370.html
Copyright © 2011-2022 走看看