python之道14

看代码写结果:

def wrapper(f):
    def inner(*args,**kwargs):
        print(111)
        ret = f(*args,**kwargs)
        print(222)
        return ret
    return inner

def func():
    print(333)

print(444)
func()
print(555)

答案

444
333
555

编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’。

答案

def warpper(f):
        def inner(*args,**kwargs):
                print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
                ret = f(*args,**kwargs)
                return ret
        return inner

@warpper
def func():
        print(111)
func()

为函数写一个装饰器,把函数的返回值 +100 然后再返回。

@wrapper
def func():
    return 7

result = func()
print(result)

答案

def warpper(f):
        def inner(*args,**kwargs):              
                ret = f(*args,**kwargs)+ 100
                return ret
        return inner

@wrapper
def func():
    return 7

result = func()
print(result)
# 106

请实现一个装饰器,通过一次调用使用函数重复执行5次。

答案

def wrapper(f):
    def inner(*args,**kwargs):
        for i in range(5):
           f(*args,**kwargs)
    return inner

@wrapper
def func():
    print(222)
func()

# 输出结果
222
222
222
222
222

请实现一个装饰器,每次调用函数时,将函数名以及调用此函数的时间节点写入文件中。

可用代码:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time)) # 当前时间节点

def wrapper():
    pass
def func1(f):
    print(f.__name__)
func1(wrapper)
函数名通过: 函数名.__name__获取。

答案

import time
# struct_time = time.localtime()
# print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time)) # 当前时间节点

def wrapper(f):
    def inner(*args, **kwargs):
        with open('a.txt',mode='r+',encoding='utf-8') as f1:
            f1.read()
            struct_time = time.localtime()
            ret = f(*args, **kwargs)

            f1.write(f"函数名:{f.__name__},当前时间节点:{time.strftime('%Y-%m-%d %H:%M:%S', struct_time)}\n")
            return ret
    return inner
@wrapper
def func1(f):
    print(f.__name__)
func1(wrapper)

# 输出文件的结果
函数名:func1,当前时间节点:2019-06-24 19:08:01
函数名:func1,当前时间节点:2019-06-24 19:08:08