返回顶部
首页 > 资讯 > 后端开发 > Python >怎么在python中使用闭包和装饰器
  • 806
分享到

怎么在python中使用闭包和装饰器

2023-06-15 01:06:36 806人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了怎么在python中使用闭包和装饰器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、闭包闭包的形成条件:函数嵌套。内部函数使用了外部函数的变量或者参数。外部函数返回了使用外 部

本篇文章为大家展示了怎么在python中使用闭包和装饰器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、闭包

闭包的形成条件:

函数嵌套。

内部函数使用了外部函数的变量或者参数。

外部函数返回了使用外 部变量的内部函数。

二、一个简单的例子

def func_out(num1):    def inner(num2):        res = num1 + num2        print(res)    return inner# a = func_out(10)(10)a = func_out(10)a(10)

闭包修改外部函数的变量:

在闭包内修改外部函数的变量需要使用nonlocal关键字

def func_out():    # 外部函数的变量    num1 = 10    def func_inner():        # 在闭包内修改外部函数的变量        nonlocal num1        num1 = 20        res = num1 +20        print(res)    print("修改前的变量", num1)    func_inner()    print("修改后的变量", num1)    return func_innernew_func = func_out()new_func()

三、装饰器

3.1 简单装饰器

装饰器就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数,也就是说也是一个函数嵌套。装饰器的功能特点:

不修改已有函数的源代码

不修改已有函数的调用方式

给已有函数增加额外的功能

用户在发表评论的时候需要验证用户是否登录,我们首先会想到去修改原来的函数,在函数里面添加一些功能,但是在现在这分工合作的时代,这样的修改很容易出现修改了祖传的代码后,函数出现问题,也影响代码的高效复用。为了能够不重新修改原来的评论的代码,实现高水平的代码复用。

原本的函数及其调用:

def comment():    print("执行祖传代码.....")    print("发表评论")# 调用评论功能comment()

自己手写一个实现装饰器功能的函数实现登录验证:

def decorator(func):    def inner():        print('正在验证登录者身份...\n验证成功')        func()    return innerdef comment():    print("执行祖传代码.....")    print("发表评论")# 调用评论功能comment = decorator(comment)comment()

输入结果:

正在验证登录者身份…
验证成功
执行祖传代码…
发表评论

3.1.1 使用装饰器的语法糖

装饰器的语法糖写法:@装饰器名称

如例子可以改写为:

def decorator(func):    def inner():        print('正在验证登录者身份...\n验证成功')        func()    return inner@decoratordef comment():    print("执行祖传代码.....")    print("发表评论")# 调用函数comment()

运行结果:

正在验证登录者身份…
验证成功
执行祖传代码…
发表评论

3.1.2 装饰器的执行时机

先说结论:在使用装饰器语法糖时,会先将该装饰器函数执行一遍。

def decorator(func):    # 测试装饰器的执行时机    print('--remark1----')    def inner():        print('正在验证登录者身份...\n验证成功')        func()    print('----remark2---')    return inner@decoratordef comment():    print("执行祖传代码.....")    print("发表评论")

输出结果:

–remark1----
----remark2—

3.2 通用装饰器

装饰的函数可能有参数传递,或者有返回值,上面写的例子中,如果依然用上面的方法及逆行装饰器的装饰将会出现问题,那是否有一个通用的装饰器能够装饰任意函数呢?

3.2.1 装饰带有参数的函数
def logging(fn):    def inner(num1,num2):        print('执行了一次计算')        fn(num1,num2)    return inner# 使用装饰器装饰函数@loggingdef sum_num(a,b):    result = a + b    print(result)    sum_num(1,2)
3.2.2. 装饰带有返回值的函数:
def logging(fn):    def inner(num1,num2):        print('执行了一次计算')        result = fn(num1,num2)        return result        return inner# 使用装饰器装饰函数@loggingdef sum_num(a,b):    result = a + b    return result    print(sum_num(1,2))
3.2.3 实现通用装饰器

*args: 用于接收元组参数,可传可不传

**kwargs: 用于接收字典类型参数,可传可不传

def logging(fn):    def inner(*args, **kwargs):        result = fn(*args, **kwargs)        return result    return inner@loggingdef sum_num(a,b):    result = a + b    return result

3.3 多个装饰器的使用

多个装饰器的过程:由内到外的装饰过程,先执行内部装饰器,再执行外部装饰器。

原理剖析:content = make_div(make_p(content))

分步拆解:content = make_p(content), 内部装饰器完成content=make_p.inner, content = make_div(make_p.inner)

def make_div(func):    print("make_div装饰器执行了")    def inner():        # 在内部函数对已有函数进行装饰        result = "<div>" + func() +"</div>"        return result    return innerdef make_p(func):    print("make_p装饰器执行了")    def inner():        # 在内部函数对已有函数进行装饰        result = "<p>" + func() +"</p>"        return result    return inner@make_div@make_pdef content():    return "人生苦短,我用Python"

输出:

make_p装饰器执行了
make_div装饰器执行了
<div><p>人生苦短,我用Python</p></div>

3.4 带有参数的装饰器

带有参数的装饰器时机上就是定义了一个函数,让函数接收参数,再函数内部返回该装饰器。

如定义一个能够判断加减的装饰器:

def return_decorator(flag):    def decorator(func):        def inner(a,b):            if flag == '+':                print("正在进行加法运算")            elif flag == '-':                print("正在进行减法运算")            func(a,b)        return inner    return decorator@return_decorator('+')def add_num(a,b):    print(a+b)add_num(1,5)

3.5 类装饰器

使用类装饰已有函数。

class MyDecorator(object):    def __init__(self,func):        self.__func = func    # 实现__call__方法,让对象变成可调用的对象,    # 可调用的对象能够像函数一样被使用。    def __call__(self,*args,**kwargs):        # 对已有参数进行封装        print('--正在进行装饰-----')        self.__func()        @MyDecoratordef show():    print("hello")# 指向MyDecorator类创建实例对象--> show()==> 对象()show()

输出:

–正在进行装饰-----
hello

Python主要用来做什么

Python主要应用于:1、web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

上述内容就是怎么在python中使用闭包和装饰器,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: 怎么在python中使用闭包和装饰器

本文链接: https://lsjlt.com/news/276349.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在python中使用闭包和装饰器
    本篇文章为大家展示了怎么在python中使用闭包和装饰器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、闭包闭包的形成条件:函数嵌套。内部函数使用了外部函数的变量或者参数。外部函数返回了使用外 部...
    99+
    2023-06-15
  • python中的闭包和装饰器的使用示例
    目录函数参数闭包的构成条件基础的闭包的使用nonloal关键字的使用基础代码实现(装饰器)装饰器的基本使用装饰器的使用有参数的装饰器的使用带有返回值的装饰器带有不定长参数的装饰器带有...
    99+
    2022-11-21
    python闭包和装饰器 python装饰器
  • python 闭包&装饰器(一)
    一、闭包 1.举例 def outer(): x = 10 def inner(): # 内部函数 print(x) # 外部函数的一个变量 return inner # 调用in...
    99+
    2023-01-30
    python
  • 简析Python的闭包和装饰器
    什么是装饰器? 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直接...
    99+
    2022-06-04
    简析 Python
  • python总结之闭包和装饰器
    目录一、装饰器1.装饰器的简单介绍2.装饰器的解析过程二、闭包三、闭包中nonlocal语句的使用1.外部变量的引用和改写2.nolocal的使用及特点四、闭包与装饰器五、闭包的作用...
    99+
    2024-04-02
  • Python装饰器-闭包与函数装饰器
    一、闭包在学习装饰器前,需要先了解闭包的概念。形成闭包的要点:函数嵌套将内部函数作为外部函数的返回值内部函数必须要使用到外部函数的变量下面以一个计算列表平均值的案例来讲解闭包:def make_average(): # 创建一个列表,用来保...
    99+
    2023-05-14
    Python 函数 装饰器
  • Python闭包与装饰器怎么定义
    这篇文章主要介绍“Python闭包与装饰器怎么定义”,在日常操作中,相信很多人在Python闭包与装饰器怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python闭包与装饰器怎么定义”的疑惑有所帮助!...
    99+
    2023-07-06
  • 深入理解python中的闭包和装饰器
    python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。 以下说明主要针对 python2.7...
    99+
    2022-06-04
    python
  • python闭包和装饰器你了解吗
    目录一、闭包1. 什么是闭包?2. 形成闭包的三个条件(缺一不可)3. 闭包的原理4. 闭包的好处二、装饰器1. 什么是装饰器2. 装饰器有什么用3. 小 练 习三. 编写...
    99+
    2024-04-02
  • python中*args与**kwarsg及闭包和装饰器的用法
    目录*args与**kwarsg及闭包和装饰器过程Python fun(*args,**kwargs)中*args,**kwargs参数含义及用法1. Python函数中的两种参数2...
    99+
    2024-04-02
  • Python返回函数、闭包、装饰器、偏函数怎么使用
    今天小编给大家分享一下Python返回函数、闭包、装饰器、偏函数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.返...
    99+
    2023-07-02
  • Python中怎么使用装饰器装饰函数
    这篇文章将为大家详细讲解有关Python中怎么使用装饰器装饰函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。***个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco...
    99+
    2023-06-17
  • 怎么在python中使用函数装饰器
    怎么在python中使用函数装饰器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
    99+
    2023-06-14
  • Python 中闭包与装饰器案例详解
    目录1.Python中一切皆对象2.函数式第一类对象3.函数对象 vs 函数调用4.闭包&LEGB法则5.装饰器&语法糖(syntax sugar)6. 回归问题项目...
    99+
    2024-04-02
  • python中装饰器怎么使用
    这篇文章给大家分享的是有关python中装饰器怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、装饰器使用场景经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解...
    99+
    2023-06-15
  • Python中怎么使用装饰器来装饰函数
    在Python中,装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,可以在不修改原始函数代码的情况下添加...
    99+
    2024-03-12
    Python
  • python高级语法之闭包和装饰器详解
    目录一、闭包二、一个简单的例子三、装饰器3.1 简单装饰器3.1.1 使用装饰器的语法糖3.1.2 装饰器的执行时机3.2 通用装饰器3.2.1 装饰带有参数的函数3.2.2. 装饰...
    99+
    2024-04-02
  • Python的闭包和装饰器你真的了解吗
    目录闭包装饰器总结闭包 闭包就是能够读取其他函数内部变量的函数。 def test1(k, b): def test1_1(x): print(k*x+b) ...
    99+
    2024-04-02
  • python装饰器property和setter怎么使用
    本篇内容介绍了“python装饰器property和setter怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.引子:函数也是对象...
    99+
    2023-07-02
  • Python基础globlalnonlocal和闭包函数装饰器语法糖
    目录一、global与nonlocal1、global2、nonlocal二、函数名的多种用法三、闭包函数1、什么是闭包函数2、闭包函数需满足的条件3、闭包函数的作用4、闭包函数的实...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作