博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 函数装饰器和闭包
阅读量:6768 次
发布时间:2019-06-26

本文共 1689 字,大约阅读时间需要 5 分钟。

参考博客: https://www.cnblogs.com/Lin-Yi/p/7306235.html

函数装饰器用于在源码中标记函数, 以某种方式增强函数的行为。 装饰器会在加载模块时直接运行。

装饰器是可调用的对象, 其参数是被装饰的函数。 但装饰器通常会把函数替换位另一个函数

实现一个简单的装饰器:

def decorate(func):     def inner():         print("我是装饰器")      func()     return inner @decorate def func():           pass func() print(func)

我是装饰器

<function decorate.<locals>.inner at 0x000002B0C71D5378>

闭包是指延申了作用域的函数。

自由变量(free variable) 指未在本地作用域中绑定的变量 python中使用nonlocal来标记自由变量

如果被装饰的函数带参数:

def decorate(func):    def inner(*args):        print("开始装饰")        func(*args)        print("装饰结束")    return inner@decoratedef func(*args):    print(*args)func(1, 2)   # 由于装饰器会把被装饰的函数替换为另一个函数,这里是inner,所以在定义inner函数时接收参受开始装饰1 2装饰结束

 如果目标函数需要多层装饰:

def decorate1(func):    def inner(*args, **kwargs):        print("装饰器1开始装饰")        func(*args, **kwargs)        print("装饰器1装饰结束")    return innerdef decorate2(func):    def inner(*args, **kwargs):        print("装饰器2开始装饰")        func(*args, **kwargs)        print("装饰器2装饰结束")    return inner @decorate1    # 相当于 func = decorate1(decorate2(func))  先执行decrate1() 函数  decorate1函数中的func执行也就是 decorate2(func)开始执行。 @decorate2def func(*args):    print(*args)func(1, 2)   装饰器1开始装饰装饰器2开始装饰1 2装饰器2装饰结束装饰器1装饰结束

 可选择装饰器, 需要三层闭包嵌套:

def flagoperation(flag):    def decorate(func):        def inner(*args, **kwargs):            print("装饰器开始装饰")            func(*args, **kwargs)            if flag == True:                print("我是后置操作")            print("装饰器装饰结束")        return inner    return decorate@flagoperation(True)    # 相当于 decorate(func)  带着一个参数 True    带着True参数再对目标函数进行装饰def func(*args):    print(*args)func(1, 2)装饰器开始装饰1 2我是后置操作装饰器装饰结束

  

转载于:https://www.cnblogs.com/frank-shen/p/10279823.html

你可能感兴趣的文章
[蓝桥杯]角谷猜想问题
查看>>
我所遇到的SQL汇总
查看>>
使用命令行运行Java程序
查看>>
走进Linux 操作系统
查看>>
css中居中的居中方法
查看>>
mysql之用户授权
查看>>
Android开发【开发环境】问题集合
查看>>
我的友情链接
查看>>
网络营销第三课:利用织梦搭建动态网站(1)
查看>>
oracle_base 和 oracle_home 的区别
查看>>
APUE读书笔记-06系统数据文件和信息-02passwd文件
查看>>
iphone学习笔记 一 sdk中对IBOlet,IBAction的解释
查看>>
基于java web开发的一个购物网站
查看>>
FreeGis站位
查看>>
JTBC方便的下拉列表来编辑系统,更方便快捷!
查看>>
Python学习--13 文件I/O
查看>>
Linux od命令
查看>>
java一维数组的冒泡排序
查看>>
对FTP服务器(Serv-U)账户赋权不当造成的安全隐患
查看>>
iOS 多态的简单思想
查看>>