python装饰器详解

本文深入探讨了装饰器的概念及其在Python中的应用。装饰器作为一种高级功能,可以在不修改原函数的情况下为其添加新特性,如计时、认证等。文章通过实例展示了无参装饰器和有参装饰器的具体实现。

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

装饰器

​ 器:指的是具备某一功能的工具

​ 装饰:指的是为被装饰器对象添加新功能

​ 装饰器:就是用来为被装饰对象添加新的功能的工具

​ 注意:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象

开放封闭原则 不改变调用方式和不修改源代码基础上增加功能
  1. 不修改被装饰对象(函数)的源代码。- 封闭
  2. 不修改被装饰对象(函数)的调用方式 - 开发
无参装饰器
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print('from foo')
foo()
有参装饰器
def auth(driver='file'):
    def auth2(func):
        def wrapper(*args,**kwargs):
            name=input("user: ")
            pwd=input("pwd: ")

            if driver == 'file':
                if name == 'egon' and pwd == '123':
                    print('login successful')
                    res=func(*args,**kwargs)
                    return res
            elif driver == 'ldap':
                print('ldap')
        return wrapper
    return auth2

@auth(driver='file')
def foo(name):
    print(name)

foo('egon')
@语法糖
def outer(f):
    def inner():
    	f()
        print("新增功能1")
    return inner
              
def wrap(f):
    def inner():
    	f()
        print("新增功能2")
    return inner              

@wrap  # 被装饰的顺序决定了新增功能的执行顺序
@outer  # = outer(fn): inner      
def fn():
    print("原有功能")

# 解释@语法时顺序是从下到上
# 而执行装饰器内的那个inner函数时的是自上而下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值