Python 闭包 & 装饰器

闭包定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包.

下面实现一个在执行方法的前后打印日志的场景

第一种方法装饰器

1.定义外层函数(要求参数只有一个,类型是函数类型,调用时传参传递的是原函数)

2.定义内层函数,在内层函数中,书写新的功能,并在合适的时机调用原函数

3.返回内部函数的地址

python 复制代码
def t1_logger(fn):
    print("t1_logger_start")
    def logger1(*args, **kwargs):
        print(u'开始执行%s'% fn)
        res=fn(*args, **kwargs)
        print(u'结束执行%s'% fn)
        return res
    print("t1_logger_end")
    return logger1
#在main方法执行之前,初始化t1_logger并执行,返回logger1方法,调用的时候再执行add1方法
@t1_logger
def add1(a,b):
    print("add1")
    return a+b

if __name__ == '__main__':
    print(add1(1,2))
    print("end")
    
#打印顺序 为
# t1_logger_start
# t1_logger_end
# 开始执行<function add1 at 0x000001EDE13AE790>
# add1
# 结束执行<function add1 at 0x000001EDE13AE790>
# 3
# end

第二种可以传递变量的装饰器

python 复制代码
def t2_logger(name=None):
    print("t2_logger_start")
    def logger2(fn):
        print(u'开始执行%s'% name)
        print(u'结束执行%s'% name)
        return fn
    print("t2_logger_start")
    return logger2

#在main方法执行之前,初始化t2_logger并执行,初始化logger2,并执行logger2,返回fn。
@t2_logger(name="加法")
def add2(a,b):
    print("add2")
    return a+b

if __name__ == '__main__':
    print(add2(1,2))
    print("end")
#打印顺序为
# t2_logger_start
# t2_logger_start
# 开始执行加法
# 结束执行加法
# add2
# 3
# end    

第三种可以传递变量的装饰器,是在第一种的外层再装一层

python 复制代码
def t3_logger(name=None):
    print("t3_logger_start")
    def decorate(fn):
        print("decorate_start")
        def logger3(*args, **kwargs):
            print(u'3开始执行%s'% name)
            res=fn(*args, **kwargs)
            print(u'3结束执行%s'% name)
            return res
        print("decorate_end")
        return logger3
    print("t3_logger_end")
    return decorate
 
@t3_logger(name="乘法")
def add3(a,b):
    print("add3")
    return a+b

if __name__ == '__main__':
    print(add3(1,2))
    print("end")
# 打印的顺序为
# t3_logger_start
# t3_logger_end
# decorate_start
# decorate_end
# 3开始执行乘法
# add3
# 3结束执行乘法
# 3
# end
相关推荐
孙启超10 小时前
【AI应用开发】LangChain 中 Chain 和 Agent 核心区别?
java·人工智能·langchain·llm·rag·ai应用开发·agent loop
J船长10 小时前
Spec Kit 入门:AI Agent 时代的规格驱动开发实践
前端
leoZ23110 小时前
实战复盘:用 Claude Code 从零搭一个 GitHub PR 统计工具
java·人工智能·python·深度学习·自然语言处理·github·llama
William Dawson10 小时前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot
2601_9557598811 小时前
如何识别 Claude API 低价值调用并优化
java
程序员黑豆11 小时前
鸿蒙应用开发 @Builder 使用教程:从入门到精通
前端·harmonyos
CCYe、11 小时前
限流与配额:企业AI网关的工程实践
前端·人工智能
看谷秀11 小时前
arkts- 6 手势/沉浸式/深浅色/性能/组件补充/访问/js交互/通知/Native交互
前端·arkts
夏天测11 小时前
Python 网络编程入门:从 Socket 底层到 HTTP 并发实战
python·socket·httpx·requests·tcp udp·python网络编程·爬虫基础
划船不慎掉水顺便摸鱼11 小时前
TipTap 不是编辑器,是编辑器构造器:ProseMirror 模型驱动的富文本架构
前端