首页 > 其他分享 >装饰器

装饰器

时间:2023-12-29 09:02:03浏览次数:18  
标签:return args inner func kwargs 装饰 def

装饰器

  • 装饰 代指为被装饰对象添加新的功能, 代指器具/工具,装饰器与被装饰的对象均可以是任意可调用对象。

【一】装饰器的作用

  • 软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。

【二】装饰器的分类

  • 函数装饰器分为:无参装饰器和有参装饰器

【三】无参装饰器

(1)无参装饰器

def outer(func):
    def inner(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return inner
@outer
def add(*args,**kwargs):
    return 1
print(add())

(2)练习

user_data = {'dhy': 20} 
def outer(func):
    def inner(*args,**kwargs):
            if user_data['dhy']>=18:
                res=func()
                return res
            else:
                return False,'18禁!'
    return inner
 
def watch(*args,**kwargs):
    return True,'
 
watch=outer(watch)
print(watch())
 
 
@outer 
def watch(*args,**kwargs):
    return True,'
print(watch())

【四】有参装饰器

  • 本质上就是在无参装饰器外面再套一层函数,再判断他的tag条件

    示例:取钱

user_data = {'username': 'dhy', 'password': '0703'}
bank_data = {'dhy': {'pay_pwd': '0703', 'balance': 1000}}

# 先验证登录
# 再验证 输入的金额 --- 符合数字 / 余额充足

def outer(func):
    def inner(*args, **kwargs):
        username=input('输入用户名:')
        password=input('输入密码:')

        if username == user_data.get('username') and password == user_data.get('password'):
            print("登录成功!")
            return func(*args, **kwargs)
        else:
            print('用户名或密码错误,登录失败')
            return None

    return inner

    # 校验登录
    # 校验金额  符合数字 / 余额充足 --- 把金额通过装饰器 返回来
    # 拿着你的金额进行提款
    ...
def check_amount(func):
    def inner(*args, **kwargs):
        amount = input("请输入取款金额: ")
        if not amount.isdigit():
            print('请重新输入数字')
            return None
        user = bank_data.get(user_data['username'])
        if int(amount) > user.get('balance'):
            print('余额不足')
            return None
        return func(amount, *args, **kwargs)
    return inner
@outer
@check_amount
def money(amount):
    user = bank_data[user_data['username']]
    user['balance'] -= int(amount)
    print(f"成功取款 {amount} 元,当前余额为 {user['balance']} 元。")
money()

【五】伪装装饰器

from functools import wraps
def wrapper(func):
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
 
    return inner
 
@wrapper
def add():
    return 1 + 1
 
print(help(add))
print(f'----------------------------')
 
def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        '''
        :param args: 可变长位置参数
        :param kwargs: 可变长关键字参数
        :return:
        '''
        return func(*args, **kwargs)
 
    return inner
 
@wrapper
def add():
    return 1 + 1
 
 
print(help(add))

标签:return,args,inner,func,kwargs,装饰,def
From: https://www.cnblogs.com/dhyuan/p/17917221.html

相关文章

  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......
  • WPF 装饰器 、 转换器 、行为
    十年河东,十年河西,莫欺少年穷学无止境,精益求精行为请参考:WPF行为 装饰器参考: wpf转换器详情参考:单值转换器需继承自IValueConverterpublicclassMyNumberConverter:IValueConverter{publicobjectConvert(objectvalue,TypetargetType,objectparameter,......
  • 常用的10个Python装饰器
    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用于在不修改原始代码的情况下添加额外的功能或功能。装饰器的语法使用@符号,将装饰器应用于目标函数或类。下......
  • python基础007----递归函数&闭包&装饰器
    一、递归函数1、递归函数概念    直接或间接的调用自身的函数,称为递归函数。每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件。2、递归函数实例#####递归函数######1、普通实现:计算n!=1*2*3*4*5*6*...*nn=int(input('普通实现阶乘,......
  • 装饰器
    1.装饰器的作用在不改变原函数代码和调用方式的基础上,为它增加新功能2.装饰器原理importtimedefadd(a,b):time.sleep(1)returna+b1.需求:统计add的运行时间start_time=time.time()add(3,4)end_time=time.time()print('运行时间是:',end_time-start_t......
  • python 装饰器
    课堂上学习的装饰器统计函数的执行时间  defouter(func):definner(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)end_time=time.time()returnres,end_time-start_timereturninner@outerdefadd......
  • WPF 装饰器 、 转换器
    十年河东,十年河西,莫欺少年穷学无止境,精益求精装饰器参考:https://www.cnblogs.com/xietianjiao/p/11239558.html wpf转换器详情参考:https://www.cnblogs.com/zh7791/p/9311332.html单值转换器需继承自IValueConverterpublicclassMyNumberConverter:IValueConvert......
  • 异步记录第三方接口调用日志的优雅实现(HttpClient+装饰者模式+异步线程池)
    对于第三方接口调用日志这个功能,笔者在工作中曾见过以下两种方式:Restemplate+装饰者模式+MQ实现网关监控+Feign拦截器+观察者模式实现其中观察者模式的实现是我最为佩服的设计,个人认为以上两种实现都显得略过臃肿,应该简化设计,让异步记录的实现更加简洁优雅,因此产生了这样......
  • Python装饰器:深入探索功能增强的神奇工具(特点+应用+举例)
    Python装饰器是一项强大的特性,它允许程序员在不改变函数或类本身的情况下,增加、扩展或修改它们的行为。从日志记录到权限验证,再到性能分析和缓存,装饰器在Python编程中发挥着重要的作用。本文将深入探讨装饰器的各个方面,从基本概念到实际应用,带您领略装饰器的神奇之处。装饰器是Pyth......
  • Python 以类作为装饰器 几种使用场景
    1.原函数、装饰器都没有参数代码:classTest:def__init__(self,func):print('Bein__init__process...')self.__func=funcdef__call__(self):print("...Startdecorate...")self.__func()prin......