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

    使用装饰器:不改变函数本身并新增功能
    装饰器:本质也是一个函数(嵌套函数+高阶函数)
    1、返回值:函数对象(内层函数)
    2、在被装饰函数之前@装饰器函数
    3、被装饰函数需要传参:装饰器内部函数也需要传参,写成inner(*args,**kwargs)适用多个被装饰函数
    4、装饰器需要传参:则在装饰器外需再套一层函数
    例子:
      
     1 # 被装饰函数有参数时,在装饰器内层函数也要有对应参数
     2 import time
     3 def timer(func):
     4     def inner(*args,**kwargs):
     5         start_time = time.time()
     6         func(*args,**kwargs)
     7         stop_time = time.time()
     8         print('the func run time is %s'%(stop_time-start_time))
     9     return inner
    10 
    11 @timer  # test1=timer(test1) return inner 即test1=inner
    12 def test1(arg):
    13     time.sleep(1)
    14     print('in the test1,arg is %s'%arg)
    15 @timer
    16 def test2():
    17     time.sleep(1)
    18     print('in the test2')
    19 test1('123') # 执行到这里时 test1('123')=inner('123')
    20 test2()
    
    

    装饰器本身需要传参时,需要再嵌套一层函数

     1 # 装饰器本身需要传参
     2 user,passwd = 'admin','123456'
     3 def auth(auth_type):
     4     print('auth func ',auth_type)
     5     def outer_wrapper(func):
     6         def wrapper(*args,**kwargs):
     7             print('wrapper func args',*args,**kwargs)
     8             if auth_type == 'local':
     9                 username = input('Username:').strip()
    10                 password = input('Password:').strip()
    11                 if username == user and password == passwd:
    12                     # 设置颜色开始 :33[显示方式;前景色;背景色m
    13                     print('33[0;32;47;1mUser has passed authentication33[0m')
    14                     res = func(*args,**kwargs)
    15                     print('---after authentication')
    16                     return res # 被装饰函数有返回值
    17                 else:
    18                     print('33[0;31;47;1mInvalid username or password33[0m')
    19             elif auth_type == 'ldap':
    20                 print('不需要验证')
    21         return wrapper
    22     return outer_wrapper
    23 
    24 def index():
    25     print('welcome to index page')
    26 @auth(auth_type='local')  #home = wrapper :auth() -->return outer_wrapper -->outer_wrapper()-->return wrapper
    27 def home():
    28     print('welcome to home page')
    29     return 'from home'
    30 @auth(auth_type='ldap')
    31 def bbs():
    32     print('welcome to bbs page')
    33 
    34 index()
    35 print(home())
    36 bbs()
     
  • 相关阅读:
    C++中数字与字符串之间的转换
    关于安卓启动eclipse错误:找不到元素‘d:devices'的声明
    linux相关解压命令
    泛型
    CRUD工程师---番外篇---反射
    CRUD工程师---设计模式
    AOP切面日志
    CRUD工程师---InnoDB存储引擎
    CRUD工程师---InnoDB存储引擎2
    CRUD工程师---InnoDB存储引擎4(表)
  • 原文地址:https://www.cnblogs.com/aiyumo/p/12051036.html
Copyright © 2011-2022 走看看