装饰器decorator
只加强一次功能的装饰器:
print('/\\')
print('/\ta')
def b(fn):
def wrapper():
print('bbbbb')
return fn
return wrapper()
@b
def p():
print(111111111)
print(p)
p()
p()
def b(fn):
def wrapper(*args,**kwargs):
print('bbbbb')
return fn
return wrapper
@b
def p():
print(111111111)
print(p)
p()
print()
print(p())
print()
print(p()())
print()
print(p)
print(dir())
函数p确实被包装了,p已经变成了<function b.<locals>.wrappers at 0x00000>,其返回值为p,p可以继续调用
from functools import wraps
def b(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
print('bbbbbbbbbb')
return fn(*args,**kwargs)
return wrapper
@b
def p():
print('pppppppppppp')
return '2222222222'
print(p)
print(p(),p.__name__)
def b(fn):
def wrapper(*args,**kwargs):
print('b'*60)
print('wrapper dir ->',dir())
return fn(*args,**kwargs)
print('fn ->',fn,fn.__name__)
print('funtion b dir ->',dir())
return wrapper
print('after b dir ->',dir())
@b
def p():
print('p'*60)
print('p local variables',locals())
print('global variables',globals())
print('p in globals?','p' in globals())
# print(p)
print('p =',p)
print(dir(b))
print(b.__dict__)
fn是局部变量,出栈后销毁,fn.__name__ == 'p', 但是 "p" 不是变量,装饰的过程即是执行装饰函数,最后执行结果赋给变量 p
分类:
Python进阶
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律