装饰器的应用

本文深入探讨了Python装饰器的概念,展示了其在功能增强、登录验证等场景的应用,并通过实例解释了多层装饰器和装饰器带参数的用法。同时,文中还涉及了函数作用域、闭包等相关概念,帮助读者更好地理解和运用装饰器。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、装饰器的定义

'''
装饰器
加入购物车,付款,修改收货地址. 
判断用户的登录状态,
'''
def func(number):
    a=100
    def inner_func():
        nonlocal  a
        nonlocal number
        number+=1
        for i in range(number):
            a+=1
        print('修改后的a',a)
    return inner_func
#调用func
f=func(6)
f()

#函数作为参数
a  = 50
f1=func(a)  #实参a是一个实参
print(f1)

#地址引用
a=10  #声明整型变量
b=a
def test(): #声明函数
    print('------test------')

t=test

#test()
#t()
def func(f):
    print(f) #<function test at 0x031DD978>
    f()
    print('--------->func')
#调用
func(test)

在这里插入图片描述

二、装饰器的使用

#登录校验
import time
def decorate(func):
    def warpper(*args,**kwargs): #()
        print('正在校验中....')
        time.sleep(2)
        print('校验完毕')
        #调用原函数
        func(*args,**kwargs)
    return warpper
@decorate
def f1(n):
    print('-------f1-------',n)
f1(5)
@decorate
def f2(name,age):
    print('-------f2-------',name,age) #() {'clazz':'1904'}
f2('lily',12)
@decorate
def f3(students,classs='1905'):
    print('{}班级的学生如下:'.format(classs))
    for stu in students:
        print(stu)
students=['lily','tom','aq']
f3(students,classs='1904')

三. 多层装饰器

在这里插入图片描述

'''
如果装饰器是多层的,谁距离函数最近就优先使用哪个装饰器
'''


#装饰器
def zhuang1(func):
    print('---------->1 start')
    def wrapper(*args,**kwargs):
        func()
        print('刷漆')
    print('-------->2 end')
    return wrapper
def zhuang2(func):
    print('---------->1 start')
    def wrapper(*args,**kwargs):
        func()
        print('搬砖,装门窗')
    print('-------->2 end')
    return wrapper
@zhuang2
@zhuang1
def house():
    print('我是毛坯房.....')
house()

在这里插入图片描述

四 装饰器带参数

#装饰器带参数
'''
带参数的装饰器是三层的
最外层的函数负责接收装饰器参数
Kim的内容还是原装饰器的内容
'''

def outer(a):  #第一层 ,负责接收装饰器的参数
    def decorate(func): #第二层,负责接收函数的
        def wrapper(*args,**kwargs): #第三层 负责接收函数的参数
            func(*args)
            print('------>铺地砖{}.'.format(a))
        return  wrapper  #返出来的是,第三层
    return decorate #返出来的是,第三层

@outer(a=10)
def house(time):
    print('我{}日期拿到房子,是毛坯房'.format(time))
house('2021-10-13')


@outer(100)
def street():
    print('新修街道的名字是,黑泉路')

street()

六,案例 登录验证脚本

在这里插入图片描述

v#开发,登录验证
import time
islogin=False #默认是没有登录的
#定义一个登录函数
def login():
    username=input('输入用户名')
    password=input('输入密码.')
    if username=='admin' and password=='123456':
        return True
    else:
        return  False

#定义一个装饰器,进行付款验证
def login_required(func):
    def wrapper(*args,**kwargs):
        global islogin
        #验证用户是否登录
        if islogin:
            func(*args,**kwargs)
        else:
            # 跳转到登录页面
            print('用户没有登录,不能付款')
            islogin=login()
            print('result',islogin)

    return wrapper

@login_required
def pay(money):
    print('正在付款,付款金额是:{}元'.format(money))
    print('付款中.....')
    time.sleep(2)
    print('付款完成!')


#调用
pay(10000)

pay(8000)

总结

a=100
def func():
    a=10
    def inner_func():
        a=1
        print(a)
    #inner_func()
    return  inner_func

#调用外部函数
f=func()

f()
def zhuang(func):
    def wrapper(*args,**kwargs):
        func()
        print('-------')
    return wrapper

@zhuang
def f1 ():
    pass
函数:
作用域:LEGB
L:local 本地 局部变量
E: encloseing 嵌套
G: Global 全局
B:built-in 内置的

嵌套函数:
闭包:
1.内层函数
2.内层函数引用外层函数的变量
3.返回内层函数

装饰器:
1.内层函数
2.内层函数引用外层函数的变量
3.返出内层函数
4.函数作为外层函数参数

使用装饰器
@装饰器的名字
def 函数名():
    pass
### Python装饰器应用场景和使用方法 #### 一、装饰器的基础概念 Python中的装饰器是一种设计模式,可以动态地修改或扩展函数或类的行为,而无需更改其源代码。这种特性使得装饰器成为一种强大的工具,在许多实际开发场景中得到了广泛应用。 #### 二、常见应用场景及示例代码 ##### 1. 日志记录 通过装饰器可以在函数执行前后自动记录日志信息,便于调试和追踪程序运行状态。 ```python import logging def log_decorator(func): def wrapper(*args, **kwargs): logging.basicConfig(level=logging.INFO) logging.info(f"Function {func.__name__} started with args={args}, kwargs={kwargs}") result = func(*args, **kwargs) logging.info(f"Function {func.__name__} completed with result={result}") return result return wrapper @log_decorator def add(a, b): return a + b add(3, 5) # 输出日志并返回8 ``` 此部分描述了如何利用装饰器实现日志记录功能[^1]。 ##### 2. 性能监控 装饰器可用于测量函数的执行时间,从而评估性能瓶颈。 ```python import time def timing_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {(end_time - start_time):.4f}s to execute.") return result return wrapper @timing_decorator def compute(n): total = sum(i * i for i in range(n)) return total compute(1000000) # 打印计算所需的时间 ``` 该部分内容展示了装饰器在性能分析方面的用途[^2]。 ##### 3. 权限校验 在Web开发或其他需要安全控制的环境中,可以通过装饰器来验证用户的访问权限。 ```python def auth_required(role="user"): def decorator(func): def wrapper(user, *args, **kwargs): if user.role != role: raise PermissionError("Access denied!") return func(user, *args, **kwargs) return wrapper return decorator class User: def __init__(self, name, role): self.name = name self.role = role @auth_required(role="admin") def admin_dashboard(user): print(f"Welcome, Admin {user.name}") try: admin_dashboard(User("John", "admin")) # 正常访问 except PermissionError as e: print(e) try: admin_dashboard(User("Jane", "user")) # 抛出异常 except PermissionError as e: print(e) ``` 这部分说明了装饰器在权限管理上的作用[^2]。 ##### 4. 缓存机制 装饰器能够轻松实现简单的缓存逻辑,减少重复计算带来的开销。 ```python from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print([fibonacci(i) for i in range(10)]) # 高效生成斐波那契数列 ``` 这里介绍了装饰器作为缓存解决方案的一个例子[^2]。 #### 三、总结 以上列举了几种典型的Python装饰器应用场景,包括但不限于日志记录、性能监控、权限校验以及缓存优化等。这些案例不仅体现了装饰器的强大能力,也反映了它在提升代码质量方面的重要价值[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值