首页 > 其他分享 >装饰器

装饰器

时间:2023-12-13 16:11:22浏览次数:20  
标签:函数 get user kwargs data 装饰

【一】装饰器

装饰器(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()

标签:函数,get,user,kwargs,data,装饰
From: https://www.cnblogs.com/wx-x/p/17899275.html

相关文章

  • Python高级之装饰器
    装饰器【一】装饰器介绍装饰器的由来软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。软件包......
  • 装饰器模式
    装饰器,顾名思义,一个是待装饰者,一个是装饰者,就像我们早餐吃的煎饼,煎饼是待装饰者,其他的火腿、里脊、土豆丝、生菜等都是装饰者,但最终都没有改变这还是一个煎饼。这里代码上有两个重要的点,一个是装饰者会也会继承或者实现被装饰者,第二是装饰者的构造函数会有一个类型为待装饰者的参......
  • 装饰器
    装饰器装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能装饰器经常用于有切面需求的场景插入日志、性能测试、事务处理、缓存、权限校验等应用场景有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用【一】装饰......
  • 装饰器
    装饰器装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能装饰器经常用于有切面需求的场景插入日志、性能测试、事务处理、缓存、权限校验等应用场景有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用【一】装饰......
  • [-007-]-Python3+Unittest+Selenium Web UI自动化测试之@property装饰器默认值设置
    看示例:#!/usr/bin/python3#coding:utf-8__author__='csjin'#定义@property装饰器classPPTListModels(object):def__init__(self):self._tab_name="PPT模板"@propertydefhandle(self):returnself.__handle......
  • 【python基础之装饰器】---装饰器
    title:【python基础之装饰器】---装饰器date:2023-12-1118:54:06updated:2023-12-1214:30:00description:cover:https://home.cnblogs.com/u/dream-ze/【一】什么是装饰器装饰代指为被装饰对象添加新的功能,器代指器具/工具,装饰器与被装饰的对象均可......
  • 七、Harmony OS 之状态装饰器
    @State:@State装饰器的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。@Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量二hi可变的,但修改不会同步回父组件。@Link:@Link装饰的变量和父组件构建双向......
  • 23种设计模式——装饰者模式
    今天给大家说一下23种设计模式中装饰者模式。一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。这个时候,我们就需要用到装饰者模式了,它可以实现在不增加很多子类的情况下扩展类的功能。概念:装饰者模式(DecoratorPatt......
  • 装饰器
    【一】函数的四种定义方式无参无返回值的函数defindex():res=1+1print(res)index()#2有参无返回值的函数defindex(x):print(x)index(1)#1有参有返回值defindex(x):returnxres=index(1)print(res)#1多个参数多个返回值......
  • 装饰器
    装饰器【一】什么是装饰器装饰代指为被装饰对象添加新的功能代指器具/工具,装饰器与被装饰的对象均可以是任意可调用对象。概括地讲,装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。装饰器经常用于有切面需求的场景插入日志、性能......