首页 > 其他分享 >装饰器、闭包

装饰器、闭包

时间:2023-10-16 11:56:37浏览次数:34  
标签:闭包 函数 func print 装饰 def

用到了老是忘记,还是记录一下吧,

装饰器、闭包

python的装饰器、闭包是进入Python高级语法的基础,使用装饰器之前,有以下条件:

  • 存在闭包
  • 存在需要被装饰的函数
  • 理解函数地址的概念
理解函数的地址值

众所周知,我们定义函数后,函数名加()可以调用函数,那么我们尝试调用一下函数名呢?

    def test():
        pass
    
    
    def test1():
        pass
    
    
    # 打印函数名
    print(test)

运行结果:

<function test at 0x00000294B0F7E280>

也就是说每个函数名字都存在着他的内存地址值

理解闭包

闭包可以理解成为定义在一个函数内部的函数

在一个函数中定义了一个函数,内部函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用(函数地址值),这样就构成了一个闭包

条件:

  • 存在函数的嵌套关系
  • 内层函数引用了外层函数的变量
  • 外层函数返回内层函数的地址值

话不多说,我们上代码:

# - 存在函数的嵌套关系
# - 内层函数引用了外层函数的变量
# - 外层函数返回内层函数的地址值


def out_func(num):
    def in_func(in_num):
        print("外部函数的变量", num)
        print("内部函数的变量", in_num)
    return in_func


print(out_func(10))
res = out_func(10)
res(5)

运行结果:

<function out_func.<locals>.in_func at 0x000001FBFFD31310>
外部函数的变量 10
内部函数的变量 5
装饰器

在不修改源代码的基础上,给函数增加新的功能

装饰器会将被装饰的函数当作参数传递给装饰器同名的函数

添加装饰器,需要:

  • 存在闭包
  • 存在需要被装饰的函数

例如我们想给一个函数增加一个“输入密码”的功能,在原则上我们是不会区修改原函数的代码内容的,那么怎么实现呢?我们可以使用装饰器,给函数添加功能。

def out_func(login):
    def in_func():
        print("密码输入完成")
        login()
    return in_func


@out_func
def login():
    print("登录成功")


login()

运行结果:

密码输入完成
登录成功

这样就在不修改原来函数的基础上增加了新的功能。

标签:闭包,函数,func,print,装饰,def
From: https://www.cnblogs.com/edkong/p/17767020.html

相关文章

  • Go 匿名函数与闭包
    Go匿名函数与闭包匿名函数和闭包是一些编程语言中的重要概念,它们在Go语言中也有重要的应用。让我们来详细介绍这两个概念,并提供示例代码来帮助理解。目录Go匿名函数与闭包一、匿名函数(AnonymousFunction)二、闭包函数(Closure)一、匿名函数(AnonymousFunction)匿名函数,也称为无......
  • [转]go语言函数装饰器,接口类型变量反射赋值
     转:原文:https://juejin.cn/post/7115343063119036453------------------------ 函数装饰做基础组件经常需要用到函数修饰,例如我需要对所有被装饰方法里打印start、end。已知函数签名的装饰我们经常用的函数装饰器一般都是知道被装饰的方法的签名,然后返回一个同签名的方......
  • 深入浅出JavaScript闭包
    什么是JS闭包?JS闭包是一个难点也是JS的特色,是JS的高级特性。首先我们知道JS运行函数的时候会在内存中开辟一个存储空间,会把函数体内的代码当作字符串一摸一样的放在这个空间中,把这个空间地址赋值给函数名(变量名),当我们调用函数的时候会根据地址找到这个储存空间,然后执行储存空......
  • 【愚公系列】2023年10月 二十三种设计模式(九)-装饰者模式(Decorator Pattern)
    ......
  • Day17 装饰介绍_装饰器的视线思路_语法糖的使用_装饰器模版_时间装饰器_登录装饰器
    1.储备知识_args_kwargs_名称空间作用域_函数对象: 2.储备知识_函数的嵌套定义_闭包函数: 3.储备知识_传参的方式一_传参的方式二: 4.装饰器的介绍: 5.装饰器实现思路,解决方案一: 6.装饰器实现思路,解决方案二: 7.装饰器实现思路,解决方案三: 8.装饰器实现思路,解决方......
  • 闭包使用场景
    闭包在JavaScript中有许多应用场景,它们可以帮助你解决各种问题,包括封装数据、创建模块、处理异步操作等。以下是一些常见的闭包应用场景:封装私有变量和方法:使用闭包可以创建对象,其中包含私有成员变量和方法,这些成员对外部代码不可见。这有助于实现信息隐藏和数据封装。functi......
  • Python装饰器(一次搞清楚)
    最重要的情绪管理是要明白,没有一种情绪是不应该的一、简单装饰器Python装饰器是一种语法糖,用于在不改变原有函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数,通常使用@语法糖来应用装饰器。1.装饰器本质是一个函数,可......
  • Day16 函数对象--函数嵌套调用--闭包函数
    1.Day15_复习1: 2.Day15_复习2: 3.Day15_复习3: 4.函数对象_可以赋值_可以当做函数参数传给另外一个函数: 5.函数对象_可以当做函数另外一个函数的返回值_可以当做容器类型的一个元素: 6.函数对象初步实现ATM流程: 7.函数对象应用案例优化: 8.函数的嵌套调用: 9.......
  • 绑定方法和非绑定方法隐藏属性和property装饰器 绑定方法
    绑定方法和非绑定方法隐藏属性和property装饰器绑定方法类中得方法类能来调用,对象也能来调用,就看该方法绑定给谁了,绑定给谁就有谁来调用classStudent():hero_work='射手'def__init__(self,name,speed,hp,atk):self.name=nameself.speed=speed......
  • python装饰器顺序
    Python的装饰器是应用的函数或方法的特殊类型改变,它们会在被装饰的函数或方法被调用时执行。你可以使用多个装饰器来装饰一个函数,装饰器的执行顺序与它们应用的顺序有关#使用两个装饰器装饰一个函数@decorator1@decorator2deffunc():pass在上述代码中,首先应用的装饰......