装饰器
1.计算机基础2.编程语言和Python语言介绍3.八大基本数据类型4.python语法入门变量和常量5.python和pycharm相关补充6.计算机五大部件补充7.文件操作8.编码和解码9.字符编码10.基本数据类型的内置方法11.循坏结构12.流程控制13.基本运算符14.程序与用户交互15.迭代器16.闭包函数
17.装饰器
18.多层语法糖嵌套19.函数的参数20.函数的可变长参数21.命名关键字参数22.名称空间与作用域23.异常处理24.深浅拷贝问题25.函数的定义和调用26.控制文件读写内容的模式27.主动控制文件内指针移动28.文件的操作方法29.垃圾回收机制GC30.可变与不可变类型31.元类32.内置方法33.pickle模块34.单例模式35.方法补充issubclass和isinstance36.多态37.继承38.面向对象的三大特性39.封装40.内置函数41.面向对象42.logging模块43.subprocess模块44.正则45.datetime模块46.time模块47.绝对路径和相对路径48.random模块49.os模块50.hashlib模块51.模块与包52.json模块53.生成器54.三元运算符装饰器
(一)什么是装饰器
- 装饰:代指为被装饰对象添加新的功能。
- 器:代指器具/工具。
- 装饰器与被装饰对象均可以是任意可调用对象。
装饰器定义:
- 在不修改被装饰对象源代码和调用方式的前提下为呗装饰对象添加额外的功能。
装饰器经常用于有切莫需求的场景
- 插入日志、性能测试、事物处理、缓存、权限校验等应用场景。
- 有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
(二)装饰器的作用
- 软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
- 对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。
- 软件包含的所有功能的源代码以及调用方式,都应该避免修改,否则一旦改错,则极有可能产生连锁反应,最终导致程序崩溃
- 而对于上线后的软件,新需求或者变化又层出不穷,我们必须为程序提供扩展的可能性,这就用到了装饰器。
(三)装饰器的分类
- 函数装饰器分为:
- 无参装饰器
- 有参装饰器
- 二者的实现原理一样,都是函数嵌套+闭包+函数对象的组合使用的产物。
(四)无参装饰器
(1)计时
- 始终遵循不修改被装饰对象的源代码
import time
#计时
def index():
time.sleep(5)
print('哈哈')
start_time=time.time()
index()
end_time=time.time()
print(end_time-start_time)
# 哈哈
# 5.0000951290130615
(2)无参装饰器模板
"""装饰器标准模板"""
def add():
return 1
def outer(func):
def inner():
"""调用func 函数之前的逻辑"""
res=func()
"""调用函数func 函数之后的逻辑"""
return res
return inner
add=outer(func=add)
add()
小练习:
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
user_info_dict={'syh':10}
def outer(func):
def inner():
if user_info_dict['syh']>=18:
res=func()
return res
else:
return '18禁'
return inner
# @outer
#调用一
def see():
return '看电影!'
see=outer(func=see)
print(see())
#调用二语法糖
@outer#see=outer(func=see)
def see():
return '已成年可以观看!'
print(see())
#校验是否是管理员!
user_info_dict={'username':'syh','is_admin':True}
def outer(func):
def inner():
if user_info_dict['username'] and user_info_dict['is_admin']:
res=func()
return res
else:
return False,'此人不是管理员!'
return inner
@outer
def add():
return True,'此人是管理员!'
print(add())
装饰器语法糖
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
user_info_dict={'syh':20}
def outer(func):
def inner():
if user_info_dict['syh']>=18:
res =func()
return res
else:
return '未满18,不能观看电影!'
return inner
#装饰器语法糖
@outer#==see=outer(func=see)
def see():
return '看电影!'
print(see())
(五)有参装饰器
(1)有参装饰器模板
"""有参装饰器模板"""
def outer(func):
def inner(*args,**kwargs):
"""调用func函数之前的逻辑,校验"""
res=func(*args,**kwargs)
"""调用func函数之后的逻辑"""
return res
return inner
def add(*args,**kwargs):
print(args)
print(kwargs)
add(1,x=888)
练习
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
def outer(func):
def inner(name,age):
if age>=18:
res=func(name,age)
return res
else:
return f'{name}才不能观看电影'
return inner
def see(name,age):
return f'{name}已经了,可以看电影'
see=outer(func=see)
print(see('syh',18))
"""装饰器语法糖"""
@outer #==see=outer(func=see)
def see(name,age):
return f'{name}已经了,可以看电影'
# see=outer(func=see)
print(see('syh',18))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)