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

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

              

  • 相关阅读:
    java-String类
    多线程的细节
    java-多线程的练习----妖,等待唤醒,代码重构,lock到condition
    javascript函数的声明和调用
    表单
    java-多线程的入门_进阶总结
    uboot命令
    u-boot移植 III
    u-boot移植 II
    汇编词典
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/7245370.html
Copyright © 2011-2022 走看看