首页 > 技术文章 > 14 练习题:装饰器

raygor 2020-07-12 17:00 原文

# 1.看代码写结果:
# def wrapper(f):
#     def inner(*args,**kwargs):
#         print(111)
#         ret = f(*args,**kwargs)
#         print(222)
#         return ret
#     return inner
#
# @wrapper
# def func():
#     print(333)
#
# print(444)
# func()
# print(555)

# result: 444 111 333 222 555



# 2.编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’。
def decorator(func):
    def inner(*args, **kwargs):
        print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
        ret = func(*args, **kwargs)
        return ret
    return inner



# 3.为函数写一个装饰器,把函数的返回值 +100 然后再返回。
# @wrapper
# def func():
#     return 7
#
# result = func()
# print(result)

def wrapper(func):
    def inner():
        return func() + 100
    return inner



# 4.请实现一个装饰器,通过一次调用是函数重复执行5次。
def wrapper(func):
    def inner(*args, **kwargs):
        ret = []  # 将五次的返回值装入一个列表中返回
        for i in range(5):
            ret.append(func(*args, **kwargs))
        return ret
    return inner



# 5.请实现一个装饰器,每次调用函数时,将函数名以及调用此函数的时间节点写入文件中。
# 可用代码:
# import time
# struct_time = time.localtime()
# print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time)) # 当前时间节点
# 函数名通过: 函数名.__name__获取。
import time
def wrapper(func):
    def inner(*args, **kwargs):
        with open(r'03 作业\calling_history', encoding='utf-8', mode='a') as file_handler:
            file_handler.write(func.__name__ + ' ' + time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) + '\n')
            ret = func(*args, **kwargs)
        return ret
    return inner

@wrapper
def func():
    print('hello world.')

func()

推荐阅读