【python】闭包和装饰器

一、闭包

1、什么是闭包

闭包是一种特殊的函数,同时满足以下条件的函数就是闭包函数:

  • 函数内部定义了一个函数
  • 外部函数的返回值是内部函数
  • 外部函数的参数是一个函数(需要被增强功能的函数)

【表示形式】

def 闭包函数名(需要被增强的函数名):
	局部变量	#可有可无
	def 内部函数名(参数列表):
		前增强内容
		调用需要被增强的函数
		后增强内容
		return语句	#可有可无
	return 内部函数名

2、为什么要用闭包(优势)

  • 可以延长外部函数中局部变量的生命周期
  • 以可控的方式使用该变量(相当于实现私有化)
  • 在不改变原有函数功能的基础上,对齐进行了增强
  • 实现功能解耦,有利于代码维护和复用

3、闭包的底层逻辑

面向切面编程+动态代理

二、语法糖

1、什么是语法糖

泛指方便好用的、更容易表达某操作的语法,具有以下特点:

  • 没有增加语言的功能,但让其更好使用
  • 不影响原有语言的功能

2、为什么要增加语法糖

  • 方便程序员编程
  • 提高代码可读性

三、装饰器

1、什么是装饰器

装饰器就是一种特殊函数,借助闭包函数+语法糖来实现

【表示形式】

@装饰器名
def 需要被增强的函数名(参数列表):
	函数体

def 装饰器名(函数名f):      #一个装饰器对应一个闭包函数
	def 内部函数(*args,**kwargs):
		增强逻辑+调用函数名f()
		return f的返回值
	return 内部函数名
	
  • 类似于java中的注解

2、为什么要用装饰器

  • 代码解耦(业务逻辑、不同增强功能逻辑相分离),提高其可维护性和可复用性
  • 增强业务逻辑功能
  • 便捷开发

3、装饰器执行流程

1)当一个函数上面增加了多个装饰器时,执行顺序

@装饰器1
@装饰器2
@装饰器3
def 业务函数名(arg):
	pass
  • 由上到下(从最上面的那个装饰器开始),依次将上一次的封装结果整体作为下一次封装的输入进行封装
    在这里插入图片描述

  • 由外向内(从封装的最外层),一次嵌套调用装饰器进行执行
    在这里插入图片描述

4、装饰器底层逻辑

  • 面向切面编程
  • 装饰器设计模式(功能的增加逻辑)+动态代理设计模式(增强业务代码的逻辑)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包是一个函数对象,它引用了一些在其定义时外部环境的变量。在Python中,闭包常常用来创建装饰器装饰器其实就是一个闭包,它接受一个函数作为参数,并返回一个替代版函数。闭包允许我们在不修改原始函数的情况下,添加一些额外的功能或逻辑。 一个典型的装饰器的例子可以是这样的:在一个函数外面定义一个装饰器函数,然后通过在要装饰的函数之前添加@装饰器名称的语法糖,来应用装饰器闭包装饰器的实现机制是类似的,都是通过嵌套函数的方式来实现的。在闭包中,内部函数引用了外部函数的变量。而在装饰器中,装饰器函数接受一个函数作为参数,并返回一个内部函数,内部函数可以访问外部函数的变量。 在闭包装饰器的实现过程中,都需要注意作用域的规则。在闭包中,内部函数可以访问外部函数的局部变量,而在装饰器中,装饰器函数可以访问被装饰函数的变量。 闭包装饰器提供了一种灵活的方式来扩展函数的功能,使得我们可以在不修改原始函数的情况下,添加一些额外的逻辑。它们是Python中非常强大而且常用的特性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python中的闭包装饰器解释](https://blog.csdn.net/qq_39567748/article/details/99596644)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [python高级之装饰器](https://blog.csdn.net/qq_35396496/article/details/109147229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值