装饰器

【一】装饰器

装饰器(Decorator)是一种用于修改函数或类行为的特殊函数。它可以在不修改原始函数或类定义的情况下,通过添加额外的功能或行为来扩展其功能。

装饰器的主要作用是增强函数或类的功能,常见的应用场景包括:

  1. 函数装饰器:函数装饰器可以在不修改原函数代码的情况下,对函数进行额外的操作或修改。例如,可以用装饰器来记录函数的执行日志、计时函数的执行时间、验证函数的参数等。函数装饰器使用 @decorator_name 的语法,将装饰器应用于函数。

1.1 - 无参装饰器

在Python中,无参装饰器的实现方式与有参装饰器类似,只是装饰器函数不接受任何参数。下面是一个示例,演示了一个无参装饰器的用法:

def my_decorator(func):
    def wrapper():
        print("在函数执行之前")
        func()
        print("在函数执行之后")
    return wrapper

@my_decorator
def my_function():
    print("这是被装饰的函数")

my_function()

在上面的示例中,my_decorator 是一个无参装饰器函数,它接受被装饰的函数 my_function 作为参数,并返回一个新的函数 wrapperwrapper 函数在调用被装饰的函数之前和之后,打印额外的信息。通过在 my_function 函数上使用 @my_decorator 语法,将装饰器应用于该函数。

运行以上代码,输出结果为:

在函数执行之前
这是被装饰的函数
在函数执行之后

1.2 - 有参装饰器

有参装饰器是Python中的一种装饰器类型,它接受参数并返回一个装饰器函数。装饰器本质上是一个函数或类,它可以用于修改其他函数或类的行为,而有参装饰器则在这个基础上增加了对装饰器本身传入参数的支持。

使用有参装饰器可以为被装饰的函数或类提供更多的灵活性和定制化的功能。通过在装饰器内部定义接受参数的函数,可以在装饰器的使用过程中传入不同的参数,从而实现对被装饰对象的不同修改或增强。

下面是一个简单的示例,演示了如何定义和使用一个有参装饰器:

user_data = {'username': '', 'password': ''}  
bank_data = {'wx': {'pay_pwd': '521', 'balance': 1000}}  
user_data['username'] = None  
user_data['password'] = None  
  
  
def get_money(info=None, login_info=None):  
    if login_info == 'on':  
        if user_data.get('username') is None and user_data.get('password') is None:  
            def login(fun):  
                def inner(*args, **kwargs):  
                    user_name = input('请输入用户名')  
                    passwd = input('请输入密码')  
                    user_data['username'] = user_name  
                    user_data['password'] = passwd  
                    if user_name == user_data.get('username') and passwd == user_data.get('password'):  
                        return fun(user_name=user_name, *args, **kwargs)  
                    else:  
                        print('登陆失败')  
  
                return inner  
  
            return login  
  
    elif info == 'on':  
        def wrapper(fun):  
            def inner(*args, **kwargs):  
                pwd_input = input('请输入取款密码')  
                balance = int(input('请输入取款金额'))  
                if pwd_input != bank_data[kwargs.get('user_name')].get('pay_pwd'):  
                    print('取款密码不正确')  
                # if not balance.isdigit():  
                #     print('请输入数字')  
                if int(balance) > bank_data[kwargs.get('user_name')].get('balance'):  
                    print('余额不足')  
                else:  
                    return fun(balance=balance, *args, **kwargs)  
  
            return inner  
  
        return wrapper  
  
  
@get_money(login_info='on')  
@get_money(info='on')  
def main(*args, **kwargs):  
    print(kwargs)  
    bank_data[kwargs.get('user_name')]['balance'] -= kwargs.get('balance')  
  
    print(bank_data)  
  
  
main()
posted @ 2023-12-13 16:06  Unlucky  阅读(42)  评论(0)    收藏  举报