ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

装饰器

2022-04-14 19:32:08  阅读:125  来源: 互联网

标签:return msg inner time print 装饰 def


#装饰器,语法糖 @函数名
import time

#简单装饰器
def timer(F):
    def inner():
        start_time = time.time()
        F()
        end_time = time.time()
        print("耗时%s" % (end_time - start_time))
    return inner

@timer# 相当于 test = timer(test) 此时test变量等于 inner() 之后执行直接使用函数变量 test10 ,相当于执行inner()函数
def test10():
    for i in range(3):
        print(i)

test10()
"""
0
1
2
耗时9.059906005859375e-06
"""


#传参
def timer2(F):
    def inner(*args, **kwargs):
        start_time = time.time()
        F(*args, **kwargs)
        end_time = time.time()
        print("耗时%s" % (end_time - start_time))
    return inner#这里不能加括号

@timer2# 相当于 test11 = timer(test11) 此时test变量等于 inner() 之后执行直接使用函数变量 test11 ,相当于执行inner()函数
def test11(y):
    for i in range(y):
        print(i)

test11(3)
"""
0
1
2
耗时9.059906005859375e-06
"""

#带返回值
def timer3(F):
    def inner(*args, **kwargs):
        start_time = time.time()
        msg = F(*args, **kwargs)#保存被装饰函数返回
        end_time = time.time()
        print("耗时%s" % (end_time - start_time))
        return msg#返回被装饰函数结果
    return inner

@timer3
def test11(y):
    for i in range(y):
        print(i)
    return i

print('test11', test11(3))
"""
0
1
2
耗时7.867813110351562e-06
test11 2
"""

 

from functools import wraps


#装饰器函数的信息
def wrapper(Funt):
    @wraps(Funt)#保证被装饰函数拥有原来的属性
    def inner(*args, **kwargs):
        """
        装饰器
        :param args:
        :param kwargs:
        :return:
        """
        msg = Funt()
        return msg
    return inner

@wrapper
def test2():
    """
    函数说明
    :return:
    """
    pass

print(test2.__name__)#输出函数名
print(test2.__doc__)#输出函数说明


#带参数的装饰器
# flag = True
flag = False
def wrapper2(flag1):
    def wrapper1(Funt):
        @wraps(Funt)
        def inner(*args, **kwargs):
            # global flag
            if flag:
                """装饰"""
                msg = Funt('装饰')
            else:
                """不装饰"""
                msg = Funt("不装饰")
            return msg
        return inner
    return wrapper1

@wrapper2(flag)#执行顺序:1、wrapper2(flag) == wrapper1, 得到的结果是@wrapper1
def test3(a):
    print('a', a)

test3()#a 不装饰



#多个装饰器装饰一个函数
def wrapper3(F):
    def inner1():
        print("wrapper3, before")
        F()
        print("wrapper3, after")
    return inner1

def wrapper4(F):#F = inner1()
    def inner2():
        print("wrapper4, before")
        F()
        print("rapper4, after")
    return inner2

@wrapper4#2、test4 = wrapper4(test4) 实参test4是新变量test4,实际是inner1()
@wrapper3#1、执行 test4 = wrapper3(test4),test4 = inner1()
def test4():
    print("test4")

test4()
#执行结果
"""
wrapper4, before
wrapper3, before
test4
wrapper3, after
rapper4, after
"""

 

#练习:编写装饰器,实现注册、登陆,登陆成功一次,后续函数无需输入账号密码
status = 0

def register():
    name = input('用户名:')
    password = input('密码:')
    with open('./1.txt', mode='a+') as file:
        file.seek(0)
        while True:
            line = file.readline()
            if line:
                if name == line.split(',')[0]:
                    return "用户名已存在"
            else:
                break
        msg = name + ',' + password + '\n'
        file.write(msg)
        global status
        status = 1
        return "注册成功"

def wrapper(F):
    def inner(*args, **kwargs):
        global status
        if status == 0:
            name = input('请输入登陆用户')
            password = input('请输入密码')
            with open('./1.txt', mode='r') as file:
                while True:
                    line = file.readline().strip()
                    if line:
                        req_msg = name + ',' + password
                        if line == req_msg:
                            print('登陆成功')
                            status = 1
                            msg = F(*args, **kwargs)
                            return msg
                    else:
                        break
                if status == 0:
                    print('用户名密码不正确')
                return False
        else:
            msg = F(*args, **kwargs)
        return msg
    return inner

@wrapper
def index_1():
    print("首页一")

@wrapper
def index_2():
    print('首页二')

@wrapper
def index_3():
    print('首页三')

#print(register())#注册,成功也不用重新登录
index_1()
index_3()
index_2()

 

标签:return,msg,inner,time,print,装饰,def
来源: https://www.cnblogs.com/ggsdddup/p/16146172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有