python 闭包与装饰器的关系_Python闭包与装饰器原理及实例解析

一、闭包

闭包相当于函数中,嵌套另一个函数,并返回。代码如下:

def func(name): # 定义外层函数

def inner_func(age): # 内层函数

print('name: ', name, ', age: ', age)

return inner_func # 注意此处要返回,才能体现闭包

bb = func('jayson') # 将字符串传给func函数,返回inner_func并赋值给变量

bb(28) # 通过变量调用func函数,传入参数,从而完成闭包

>>

name: jayson , age: 28

二、装饰器

装饰器:把函数test当成变量传入装饰函数deco --> 执行了装饰操作后,变量传回给了函数test()。比如装饰器效果是test = test-1,test函数经过deco装饰后,调用test其实执行的是 test = test-1。

1、装饰器是利用闭包原理,区别是装饰器在闭包中传入的参数是函数,而不是变量。

注:其实在装饰器中,函数即变量

def deco(func): # 传入func函数。

print('decoration')

return func

def test():

print('test_func')

test = deco(test) # 对函数进行装饰。执行了deco函数,并将返回值赋值给test

>>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python装饰器是一个可以在不修改函数本身的情况下,在调用函数前后添加额外的功能的一种机制。它可以被用来检测函数的参数,缓存函数的结果,添加日志,授权等。下面是一个使用装饰器实例:@decorator def func(param1, param2): return param1 + param2func(2, 3)上面的代码中,@decorator语句会在调用func()函数之前调用decorator函数,增加额外的功能。 ### 回答2: 装饰器Python中一种特殊的函数,它可以用来修改其他函数的功能。装饰器接受一个函数作为输入,并返回一个新的函数作为输出。通过装饰器,我们可以在不修改原函数代码的情况下,给函数添加新的功能或者修改原有功能。 装饰器有以下几个特点: 1. 装饰器可以用来修改函数的行为,比如在函数执行前后添加一些额外的逻辑。 2. 装饰器是函数的高级用法,在Python中被广泛使用。 3. 装饰器本质上是一个闭包函数,它接受一个函数作为参数,并返回一个新函数。 4. 在使用装饰器时,使用@语法糖可以使得代码更加简洁明了。 下面是一个装饰器实例,用于计算函数的执行时间: ```python import time def calc_time(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"函数 {func.__name__} 执行时间为:{end_time - start_time} 秒") return result return wrapper @calc_time def my_func(n): time.sleep(n) return n result = my_func(3) print(result) ``` 在上述例子中,calc_time是一个装饰器函数,它接受一个函数作为参数,并返回一个新函数。新函数wrapper在原函数执行前后分别记录了开始时间和结束时间,并打印了函数的执行时间。通过@calc_time语法糖,在定义my_func函数时,自动应用了装饰器。最后调用my_func(3)时,装饰器会对my_func函数进行修饰,计算函数的执行时间,并返回结果。 ### 回答3: 装饰器Python中一种特殊的函数,它可以动态地修改其他函数的行为。装饰器本身是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器用于在不修改原函数代码的情况下,添加额外的功能或修改原函数的行为。 装饰器通常使用@语法来使用,将其放在要装饰的函数上方。装饰器可以用来进行代码的日志记录、输入参数的验证、性能分析等。实现一个装饰器的基本步骤如下: 1. 创建一个装饰器函数,接受一个函数作为输入参数。 2. 在装饰器函数内部,定义一个嵌套函数,用于实现额外的功能。 3. 在嵌套函数内部,执行原函数,并对原函数的返回结果进行处理。 4. 返回嵌套函数作为装饰器函数的结果。 下面是一个简单的装饰器实例: ```python def log_decorator(func): def wrapper(*args, **kwargs): print("开始执行函数") result = func(*args, **kwargs) print("函数执行结束") return result return wrapper @log_decorator def add(a, b): return a + b result = add(3, 5) print(result) ``` 在上面的例子中,我们定义了一个装饰器函数log_decorator。它接受一个函数作为参数,并返回一个新的函数wrapper。在wrapper函数内部,我们首先输出"开始执行函数",然后调用原函数add,并将其返回结果保存在result变量中。最后,我们输出"函数执行结束"并返回result。 当我们调用add函数时,实际上是调用了被装饰过的函数wrapper。这样我们就可以在不修改add函数的情况下,给它添加额外的功能,即输出函数的执行过程。 上述代码的输出结果为: ``` 开始执行函数 函数执行结束 8 ``` 从输出结果可以看出,装饰器成功地在add函数的执行前后进行了额外的操作。这就是装饰器的基本使用方法和作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值