Python——装饰器(两种不同的使用场景)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python——装饰器(两种不同的使用场景)相关的知识,希望对你有一定的参考价值。

#例子,通过装饰器给show_name()函数增加验证功能

#version 1 #普通函数不带参数,装饰器带参数
def auth(func):
    # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
    def auth_decorator(user, pwd):
        u = "toby"
        p = "1qaz#EDC"
        if user == u:
            if pwd == p:
                print("auth done...")
                func() #所以形式参数func等价于show_name()
            else:
                print("password error")
        else:
            print("not found user")
    return auth_decorator

@auth
def show_name():
    print("my name is toby")

show_name("toby","1qaz#EDC")

# #########################################################################################
#version 2 普通函数和装饰器都带参数
def auth(func):
    # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
    def auth_decorator(name, user, pwd):
        u = "toby"
        p = "1qaz#EDC"
        if user == u:
            if pwd == p:
                print("auth done...")
                func(name) #所以形式参数func等价于show_name()
            else:
                print("password error")
        else:
            print("not found user")
    return auth_decorator

@auth
def show_name(name):
    print("my name is {0}".format(name))

show_name("ttr", "toby","1qaz#EDC")
#此时就要把show_name函数看成是show_name(name, user, pwd)这样,传三个参数进去

# #########################################################################################
#version 3 下面的使用的语法,允许动态的创建装饰过的函数对象
def auth(func):
    # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
    def auth_decorator(user, pwd):
        u = "toby"
        p = "1qaz#EDC"
        if user == u:
            if pwd == p:
                print("auth done...")
                func() #所以形式参数func等价于show_name()
            else:
                print("password error")
        else:
            print("not found user")
    return auth_decorator

def show_name():
    print("my name is juck")

#在这个函数中用auth_enable参数来控制是否装饰show_name函数
#auth_enable参数为True,则必须提供user和pwd
#也就是说是开启验证和关闭验证由auth_enable来决定
def show_name_strengthen(auth_enable=False, u=None, p=None ):
    if auth_enable:
        s = auth(show_name)
        s(u, p)
    else:
        show_name()
#show_name_strengthen()
show_name_strengthen(True, "toby", "1qaz#EDC")


'''
两种不同的语法,使用场景:
    1、语法用@符号来使用装饰器,这种语法往往用于对不同的函数做永久性的更改
    2、这种语法允许我们动态的创建装饰过的函数对象,比如有多个不同功能的装饰器,
    引入判断条件来使用不同的装饰器,也就是说可支持多种可选行为
'''


以上是关于Python——装饰器(两种不同的使用场景)的主要内容,如果未能解决你的问题,请参考以下文章

Python装饰器的写法以及应用场景

使用两种不同的装饰器实现来装饰所有类方法的元类

理解python中的装饰器

python 装饰器的使用

python基础--定义装饰器(内置装饰器)

python 3层装饰器及应用场景