python之装饰器

Posted python学习之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之装饰器相关的知识,希望对你有一定的参考价值。

python之装饰器

一.定义:在不破坏原有函数和原有函数调用的基础上. 给函数添加新的功能
def wrapper(fn):
     def inner(*args, **kwargs): # 聚合
           在目标函数之前
            ret = fn(*arg, **kwargs) # 打散
            在目标函数之后
            return ret
        return inner
@wrapper
def func():
      pass
func()  

二. 同一个函数被多个装饰器装饰(举例说明)

def wrapper1(fn):
    def inner(*args, **kwargs):
        print("1111111")
        ret = fn(*args, **kwargs)
        print("2222222")
        return ret
    return inner

def wrapper2(fn):
    def inner(*args, **kwargs):
        print("3333333")
        ret = fn(*args, **kwargs)
        print("44444444")
        return ret
    return inner

def wrapper3(fn):
    def inner(*args, **kwargs):
        print("555555")
        ret = fn(*args, **kwargs)
        print("666666")
        return ret
    return inner


# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
    print("我是可怜的func")

func()
# 1 2 3  func 3 2 1

三. 带参数的装饰器

def wrapper_out(参数):
    def wrapper(fn):
        def inner(*args, **kwargs): # 聚合
            在目标函数之前
             ret = fn(*arg, **kwargs) # 打散
             在目标函数之后
              return ret
         return inner
     return wrapper
@wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
def func():
     pass

 

# def wrapper_out(flag): # 装饰器本身的参数
#     def wrapper(fn): # 目标函数
#         def inner(*args, **kwargs): # 目标函数执行需要的参数
#             if flag == True:
#                ret = fn(*args, **kwargs) # 在执行目标函数之前
#                return ret
#             else:
#                 ret = fn(*args, **kwargs)  # 在执行目标函数之前
#                 return ret
#         return inner
#     return wrapper
#
#
# # 语法糖 @装饰器
# @wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器
# def func(): # 被 wrapper装饰
#     print("啦啦啦")
#
#func()

 四.装饰器的应用

menu = ("查看", "添加", "修改", "删除", "退出")

flag = False # 没登录


def login():
    global flag
    username = input("请输入用户名:")
    password = input("请输入密码:")
    if username == "alex" and password == "123":
        flag = True
        print("登录")
    else:
        flag = False
        print("用户名密码错误")


# 登录验证装饰器
def login_verify(fn):
    def inner(*args, **kwargs):
        # 登录校验
        while 1:
            if flag == True:
                ret = fn(*args, **kwargs)
                return ret
            else:
                print(‘对不起, 您还没有登录‘)
                login()
    return inner

def chakan():
    print("==============================查看")

@login_verify
def tianjia():
    print("============================添加")

@login_verify
def xiugai():
    print("=======================修改")

@login_verify
def shanchu():
    print("=========================删除")


while 1:
    for i in range(len(menu)):
        print(i+1, menu[i])

    num = input("请输入你要执行的菜单:")
    if num == "1":
        chakan()
    elif num == "2":
        tianjia()
    elif num == "3":
        xiugai()
    elif num == "4":
        shanchu()
    elif num == "5":
        print("程序退出中..........")
        exit()
    else:
        print("输入有误. 请重新选择!")

  

 

 

以上是关于python之装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python之装饰器

python之装饰器

Python之装饰器

python之装饰器

我要学python之装饰器

Python之----装饰器