• python 基础 —装饰器练习


    由于对装饰器不是特别理解,因此做了以下练习,并debug自行理解,在此做一个记录

    以下练习均出自菜鸟教程装饰器一章 http://www.runoob.com/w3cnote/python-func-decorators.html

    第一个练习

     1 from functools import wraps
     2 
     3 def deco_name(f):
     4     @wraps(f)
     5     def decorated(*args,**kwargs):
     6         if not can_run:
     7             return "Function will not run"
     8         return f(*args,**kwargs)
     9     return decorated
    10 
    11 @deco_name  #func=deco_name(func)
    12 def func():  #执行了deco_name装饰器后返回来了decorated,因此func=decorated
    13     return("Function is running")
    14 
    15 can_run =True
    16 print(func())
    17 #执行func()相当于执行decorated()
    18 # can_run =True,因此decorated()返回func()返回的值:"Function is running"
    19 
    20 can_run =False
    21 print(func())
    22 #can_run =False,decorated()进入if选择,返回了"Function will not run"
    View Code

    当使用装饰器装饰一个函数时,函数本身就已经是一个新的函数;即函数名称或属性产生了变化。

    在python的functools模块中提供了wraps装饰函数来确保原函数在使用装饰器时不改变自身的函数名及应有属性。
    因此在装饰器的编写中建议加入wraps确保被装饰的函数不会因装饰器带来异常情况。

    第二个练习

     1 from functools import wraps
     2 
     3 def logit(func):
     4     @wraps(func)
     5     def with_logging(*args, **kwargs):
     6         print(func.__name__ + " was called") #addition_func=func ==》输出addition_func_was called
     7         return func(*args, **kwargs) #addition_func=func,因此返回addition_func执行的结果
     8 
     9     return with_logging
    10 
    11 
    12 @logit  #  addition_func=logit(addition_func=func)返回with_logging ==》addition_func=with_logging
    13 def addition_func(x):
    14     """Do some math."""
    15     return x + x
    16 
    17 #addition_func(4)= with_logging(4)=func(4)
    18 result = addition_func(4)
    19 print(result)
    View Code

    第三个练习

    带参数的装饰器

     1 from functools import wraps
     2 def logit(logfile='out.log'):
     3     def logging_decorator(func):
     4         @wraps(func)
     5         def wrapped_function(*args, **kwargs):
     6             log_string = func.__name__ + " was called"
     7             print(log_string)
     8             # 打开logfile,并写入内容
     9             with open(logfile, 'a') as opened_file:
    10                 # 现在将日志打到指定的logfile
    11                 opened_file.write(log_string + '
    ')
    12             return func(*args, **kwargs)
    13         return wrapped_function
    14     return logging_decorator
    15 
    16 @logit() #myfunc1=logit(myfunc1)
    17 def myfunc1():
    18     pass
    19 
    20 myfunc1()
    21 # Output: myfunc1 was called
    22 # 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串
    23 
    24 @logit(logfile='func2.log')
    25 def myfunc2():
    26     pass
    27 
    28 myfunc2()
    29 # Output: myfunc2 was called
    30 # 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串
    View Code
  • 相关阅读:
    ios 关闭自动修正输入内容
    Tarjan+缩点【强连通分量】【模板】
    初识Tarjan算法
    【尺取法】【转】
    【先加后减拼凑思想】【合成数问题】
    强连通分量【k 算法、t 算法】
    大数【加减乘除】
    洛谷博客地址【置顶!】
    差分约束+spfa【模板】
    【poj3169】【差分约束+spfa】
  • 原文地址:https://www.cnblogs.com/cherrycui/p/10256184.html
Copyright © 2020-2023  润新知