装饰器习题一些基本的

原文链接: http://www.cnblogs.com/dragonff/p/10120269.html

1、整理装饰器的形成过程,背诵装饰器的固定格式

复制代码
固定格式
def wrapper(func): 2.传入函数值f
    def inner(*args, **kwargs):
        #执行函数前进行的操作
        ret = func(*args,**kwargs)  # 5.执行f()函数
        #执行函数后进行的操作
        return ret   # 6.返回一个值给函数调用者  inner函数名的id
    return inner   # 4.通过return把返回值给函数调用者  此时f = inner
@wrapper  # 1.f = wrapper(f)执行wrapper函数
def f():
    print(666)
f() 3.执行inner函数 f() = inner()

注意:return用法 
1.函数遇到return时函数体结束
2.如果return后面跟上函数名则返回函数名在内存中的id
3.如果return后面跟上其他字符则返回其本身
复制代码

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

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

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

复制代码
def func1(f):
    def inner():
        f()
        print('每次执行被装饰函数之后都得先经过这里,这里根据需求添加代码')
    return inner


@func1
def func2():
    print('hello world')


func2()
复制代码

4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.

复制代码
def func2(f):
    def innter():
        a = 1

        while a <= 3:
            username = input('请输入用户名')
            password = input('请输入密码')
            if username == 'jinyuan' and password == '123':
                f()
                break
            else:
                print('账号密码错误你还有{}次机会'.format(3-a))
                a += 1
                continue
    return innter


@func2
def func1():
    print('登录成功')


func1()
复制代码

5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
  要求登录成功一次,后续的函数都无需再输入用户名和密码

复制代码
dic = {
    'name':None,
    'status' : False
}

def func1(f):
    def inner(*args,**kwargs):
        num = 0
        while num < 3:
            if dic['status']:
                ret = f(*args,**kwargs)
                return ret
            else:
                username = input('请输入用户名')
                password = input('请输入密码')
                f1 = open('test.txt',encoding='utf-8')
                for i in f1:
                    new_list = i.strip().split()
                    if username == new_list[0] and password == new_list[1]:
                        dic['status'] = True
                        break
                else:
                    num += 1
                    print('输入用户名或密码错误还有{}次机会'.format(3-num))
                    continue
    return inner


@func1
def func4():
    print('登录成功')


func4()
复制代码

6,给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

复制代码
import time
def wapper(f):
    def inner(*args,**kwargs):
        struct_time = time.localtime()
        time_log = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
        f1 = open('log1.txt',encoding='utf-8',mode='a')
        f1.write(time_log+'\t')
        f1.write(str(f)+'\n')
        f(*args,**kwargs)
    return inner


@wapper
def func1(*args,**kwargs):
    print('hello world')


func1('aa','bbb')

转载于:https://www.cnblogs.com/dragonff/p/10120269.html

猜你喜欢

转载自blog.csdn.net/weixin_30906425/article/details/94830257
今日推荐