函数三

本文详细介绍了装饰器的概念及其在不修改源代码和调用方式的前提下如何为函数添加新功能。通过具体实例展示了装饰器的基本使用方法,并进一步探讨了多装饰器叠加的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、装饰器
    1 开放封闭原则
        软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
        也就是说我们必须找到一种解决方案:能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能
        总结,原则如下:
                1、不修改源代码
                2、不修改调用方式
        目的:
            在遵循1和2原则的基础上扩展新功能

    2、什么是装饰器?
        器指的工具,装饰指的是为被装饰对象添加新功能

        完整含义:
            装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

            装饰器与被装饰的对象均可以是任意可调用的对象

            装饰器=》函数
            被装饰的对象=》函数

        装饰器
        def timmer(func):
            #func=最原始的home
            def wrapper(*args,**kwargs):
                start_time=time.time()
                res=func(*args,**kwargs) #调用最原始的home
                stop_time=time.time()
                print(stop_time-start_time)
                return res
            return wrapper

        index=timmer(index) # 新的index=wrapper
        home=timmer(home) #新的home=wrapper

        无参装饰器模板
        def outer(func):
            def inner(*args,**kwargs):
                res=func(*args,**kwargs)
                return res
            return inner
    装饰器语法:
            在被装饰的函数上@timmer,必须独占一行且在被装饰的上一行,装饰器也要放在被装饰函数前。
        def timmer(func):
            def wrapper(*args,**kwargs):
                start_time=time.time()
                res=func(*args,**kwargs)
                stop_time=time.time()
                print(stop_time-start_time)
                return res
            return wrapper

        @timmer #index=timmer(index)
        def index():
            time.sleep(1)
            print('welcome to index page')
            return 122

        @timmer # home=timmer(home)
        def home(name):
            time.sleep(2)
            print('welcome %s to home page' %name)

        多装饰器叠加:
            import time
            current_user={
                'username':None,
                # 'login_time':None
            }

            def auth(func):
                # func=index
                def wrapper(*args,**kwargs):
                    if current_user['username']:
                        print('已经登陆过了')
                        res=func(*args,**kwargs)
                        return res

                    uname=input('用户名>>: ').strip()
                    pwd=input('密码>>: ').strip()
                    if uname == 'egon' and pwd == '123':
                        print('登陆成功')
                        current_user['username']=uname
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('用户名或密码错误')
                return wrapper

            def timmer(func):
                def wrapper(*args,**kwargs):
                    start_time=time.time()
                    res=func(*args,**kwargs)
                    stop_time=time.time()
                    print(stop_time-start_time)
                    return res
                return wrapper

            @timmer # timmer 统计的是auth+index的执行时间
            @auth
            def index():
                time.sleep(1)
                print('welcome to index page')
                return 122

            index()













转载于:https://www.cnblogs.com/yangwei666/p/8670058.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值