装饰器
装饰器简介
'''
装饰器:由名称空间 函数对象 闭包函数组合而来
'''
器:指的是工具
装饰:给被装饰对象添加额外的功能
装饰器的原则:
开放封闭原则
开放:对扩展开放
封闭:对修改封闭
装饰器核心思想:
在不改变被'装饰对象内部代码' 和 '原有调用方式' 的基础之上添加额外功能
def index():
print('from index')
index()
import time
def index():
time.sleep(3)
print('from index')
start_time = time.time()
index()
end_time = time.time()
print(end_time - start_time)
装饰器简易版本
def outer(func):
def get_time():
start_time = time.time()
func()
end_time = time.time()
print('函数运行时间:%s' % (end_time - start_time))
return get_time
index = outer(index)
index()
解决参数问题
import time
def index():
time.sleep(3)
print('第一次代码')
def login(name):
time.sleep(2)
print('%s正在发牌'%name)
def outer(func)
def get_time(*args,**kwargs):
start_time = time.time()
func()
end_time = time.time()
print('执行时间为%s'%(end_time - start_time))
return get_time
login = outer(login)
login('jjjjj')
index = outer(index)
index()
解决返回值问题
import time
def index():
time.sleep(3)
print('第一次代码')
return 'from index'
def login(name):
time.sleep(2)
print('%s正在发牌'%name)
return 'from login'
def outer(func):
def get_time(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('执行时间为%s'%(end_time - start_time))
return res
return get_time
login = outer(login)
res = login('jjjjj')
print(res)
index = outer(index)
index()
认证装饰器
import time
def index():
time.sleep(2)
print('学习学习学习')
def home():
time.sleep(2)
print('还是学习')
def register():
time.sleep(2)
print('注册功能')
'''
在调用index之前需要用户输入用户名和密码
正确才可以使用
错误直接拒绝
'''
is_login = {'is_login':Flase}
def login_auth(func):
def auth(*args,**kwargs):
if is_login.get('is_login'):
res = func(*args,**kwargs)
return res
username = input('username>>>>').strip()
psw = input('psw>>>>').strip()
if username == 'jason' and psw == '123':
res = func(*args,**kwargs)
is_login['is_login'] = True
return res
else:
print('用户名或密码错误')
return auth
index = login_auth(index)
index()
home = login_auth(home)
home()
register = login_auth(register)
register()
装饰器固定模板
def outer(func):
def inner(*args,**kwargs):
print('执行函数之前可以添加的功能')
res = func(*args,**kwargs)
print('执行函数之后可以添加的功能')
return res
return inner
装饰器语法糖
def outer(func):
def inner(*args,**kwargs):
print('执行函数之前可以添加的功能')
res = func(*args,**kwargs)
print('执行函数之后可以添加的功能')
return res
return inner
@outer
def index():
print('sssss')
index()
'''
装饰器语法糖其实就是书写规范
语法糖必须紧贴在被装饰函数对象的上方
装饰器语法糖内部原理
会自动将紧贴着的被装饰函数对象的函数名当作参数传给装饰器调用
'''
双层语法糖
import time
def get_time(func):
def inner(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print('时间差为%s'%(end_time - start_time))
return res
return inner
def login_auth(func):
def inner(*args,**kwargs):
username = input('username>>>').strip()
psw = input('psw>>>>').strip()
if username == 'jason' and psw == '123':
res = func(*args,**kwargs)
return res
print('用户名或密码错误')
return inner
@login_auth
@get_time
def index():
time.sleep(2)
print('from index')
index()
装饰器修复技术
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args, **kwargs):
print('执行函数之前可以添加的额外功能')
res = func(*args, **kwargs)
print('执行函数之后可以添加的额外功能')
return res
return inner
@outer
def index():
print('from index')
print(index)
help(index)
def home():
"""这是一个home函数"""
print('from home')
语法糖习题
def outter1(func1):
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2):
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3):
print('加载了outter3')
def wrapper3(*args, **kwargs):
print('执行了wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
@outer1
@outer2
@outer3
def index():
print('from index')
index()
加载了outter3
加载了outter2
加载了outter1
执行了wrapper1
执行了wrapper2
执行了wrapper3
from index
有参装饰器
def outer(source_data):
def login_auth(func):
def auth(*args,**kwargs):
if source_data == 'file':
print('file文件获取')
elif source_data == 'MySQL':
print('MySQL数据库获取')
elif source_data == 'postgreSQL':
print('postgreSQL数据库获取')
else:
print('用户名或密码错误 无法执行函数')
return auth
return login_auth
@outer('file')
def index():
print('from index')
@outer('MySQL')
def home():
print('from home')
index()
home()

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)