zoukankan      html  css  js  c++  java
  • python-day4-装饰器的使用

    摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM的要一个一个加到里面不可么~~~~生无可恋的小A无奈的望着桌面,在扫过谷歌浏览器图标的那一刻,突然一紧,于是机智的打开谷歌搜索,欲寻到一个简单的方法,经过搜索在一个叫银角大王的lowB博客里面找到了一个叫做装饰器的东东,然后耐心的看了下去……

    图解python装饰器的执行流程

     

     1 #装饰器的使用
     2 # 自动执行outer函数并且将其下面的函数名f1当作参数传递
     3 # 将outer函数的返回值,重新赋值给f1
     4 #  1、遇到def outer(func) 加载到内存,跳过函数体
     5 #  2、遇到@outer,将f1作为参数传入func中
     6 #  3、遇到def inner():将函数加载到内存跳过函数体
     7 #  4、遇到return inner,将inner函数作为整体,赋值给f1
     8 #  5、遇到f1(),调用inner函数体,执行print(‘log’)
     9 #  6、遇到return func() 执行作为参数传入func中的老的f1函数的函数体print('F1')
    10 #  7、遇到return 'lululu'将lululu传回f1()中
    11 def outer(func):
    12     def inner():
    13         print('log')
    14         return func()
    15     return inner
    16 @outer
    17 def f1():
    18     print('F1')
    19     return 'lululu'
    20 print(f1())
    21 >>>log
    22 >>>F1
    23 >>>lululu
    #带参数的传递
    def outer(func):
        def inner(a):
            print('before')
            r=func(a)
            print('after')
            return r
        return inner
    
    @outer
    def f1(arg):
        print(arg)
        return 'lululu'
    print(f1('huhuh'))
    >>>before
    >>>huhuh
    >>>after
    >>>lululu
    
    #万能参数传递
    def outer(func):
        def inner(*args,**kwargs):
            print('before')
            r=func(*args,**kwargs)
            print('after')
            return r
        return inner
    @outer
    def f1(arg):
        print('f1函数体',arg)
        return 'lululu'
    print('返回值',f1('huhuhu'))
    >>>before
    >>>f1函数体 huhuhu
    >>>after
    >>>返回值 lululu
    
    @outer
    def f2(a1,a2):
        print('f2函数体','F2')
        return 'aa' 'bb'
    print('返回值',f2('hu','lu'))
    >>>before
    >>>f2函数体 F2
    >>>after
    >>>返回值 aabb
  • 相关阅读:
    Android App Bundle 使用指南
    Homebrew国内源
    Mac下配置环境变量不生效问题
    CocosCreator1.x配置打包Android App Bundle
    Android读取Json文件的工具类
    Cocos Creator 坐标转换
    XCode真机调试不了,提示"Please reconnect the device"
    Canvas: trying to draw too large(134374464bytes) bitmap.
    Modbus主从关系几点记录
    当前时间加上几天
  • 原文地址:https://www.cnblogs.com/liguangxu/p/5540885.html
Copyright © 2011-2022 走看看