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# datagridview导出到excel【转载】
    使用AO新增记录的3种方法【转载】
    AE 打包
    ArcMap 9使用技巧
    ArcEngine 渲染的使用【转载】
    关于数据库版本压缩
    SDE数据源直连
    ArcCatalog 9中的使用技巧
    AE指定字段转成注记
  • 原文地址:https://www.cnblogs.com/aiyumo/p/12051036.html
Copyright © 2011-2022 走看看