python - 装饰器(重点,难点(比较绕))

本文详细介绍了Python装饰器的概念及其实现原理,包括装饰器如何通过闭包扩展原有函数的功能而不改变其调用方式,同时提供了多种装饰器的示例代码。

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

装饰器

装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
# 最简单的装饰器:
# def timemer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
#     def inner():        #在装饰器中需要定义一个内部函数
#         qqxing()        #被装饰的函数,并且要执行
#     return inner        #将内部函数的名字返回
#
# def func():
#     print('我是好人')
#
# func = timemer(func)
# func()

# 装饰器中对被装饰的函数功能的扩展
# def timmer(qqxing):
#     def inner():
#         print('调用func之前')
#         qqxing()
#         print('调用func之后')
#     return inner
#
# @timmer  #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func)
# def func():
#     print('我是好人')
#
# func()
# def timmer(qqxing):
#     def inner(name):
#         print('调用func之前')
#         qqxing(name)
#         print('调用func之后')
#     return inner
#
# @timmer  #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func)
# def func(name):
#     print('%s是好人'%name)
#
# @timmer
# def func1(name):
#     print('%s是好人'%name)
#
# func('文文')
# # 完整的装饰--万能的装饰
# def timmer(qqxing):
#     def inner(*args,**kwargs):
#         qqxing(*args,**kwargs)
#     return inner
#
# @timmer
# def func(name):
#     print('%s是好人'%name)
#
# @timmer
# def func1(a):
#     print('func2: %s'%(a))
#
# func('tom')
# func1(a=3)
装饰器的固定结构:
def wrapper(func):
def inner(*args,**kwargs):
'''被装饰函数执行之前要添加的代码'''
ret = func(*args,**kwargs)
'''被装饰函数执行之后要添加的代码'''
return ret
return inner

开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
装饰器是开放封闭原则的完美演绎

练习题

#用装饰器实现,访问art或者dar函数,登陆一次之后,无需再次登录
# flag = False
# def login(func):
#     def inner(*args,**kwargs):
#         global flag
#         if flag == False:
#             username = input('用户名:')
#             password = input('密码:')
#             if username == 'alex' and password == 'somebody':
#                 print('登录成功')
#                 flag = True
#         if flag == True:
#             ret = func(*args,**kwargs)
#             return ret
#     return inner
#
# @login
# def art():
#     print('欢迎来到文章页')
#
# @login
# def dar():
#     print('欢迎来到日记页')
#
# art()
# dar()
View Code
# def log(func):
#     def inner(*args,**kwargs):
#         print('你要调用%s函数了'%func.__name__)
#         ret = func(*args,**kwargs)
#         return ret
#     return inner
#
# @log
# def f1():
#     print('f1')
# @log
# def f2():
#     print('f2')
#
# f1()
# f2()
View Code

 

 
 
 

转载于:https://www.cnblogs.com/dwenwen/p/7772924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值