加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python闭包和装饰器

发布时间:2020-12-20 10:40:06 所属栏目:Python 来源:网络整理
导读:闭包 定义:两个函数的嵌套,外部函数返回内部函数的引用,内函数运用了外部函数参数传入的临时变量。 作用:装饰器的实现,提高代码的复用性 缺点:引用了外部函数的局部变量,该变量没有及时释放,消耗内存 模板:def 外部函数(a):? ?? ?? ?? ?? ?? ??

闭包

  • 定义:两个函数的嵌套,外部函数返回内部函数的引用,内函数运用了外部函数参数传入的临时变量。
  • 作用:装饰器的实现,提高代码的复用性
  • 缺点:引用了外部函数的局部变量,该变量没有及时释放,消耗内存
  • 模板:def 外部函数(a):? ?? ?? ?? ?? ?? ?? ?? ? ------必须含有参数,否则无嵌套的意义


? ?? ?? ?? ?? ?? ???def 内部函数(b):? ?? ?? ?? ?? ?? ?------参数可有可无,
? ?? ?? ?? ?? ?? ?? ?? ?? ?print(a+b)? ?? ?? ?? ?? ?? ?? ?? ?? ? -----参数的运算操作
? ?? ?? ?? ?? ?? ?? ?return 内部函数? ?? ?? ?? ?? ?? ?? ?? ???------外部函数返回内部函数的引用

  • 调用:外部函数()? ?? ?------ 调用外部函数


? ? func = 外部函数()? ?? ?func()-------调用内部函数
装饰器

  • 定义:一种特殊的函数,由两个函数嵌套(即闭包)实现
  • 作用:在不修改函数的参数及返回值的前提下,对函数增加额外功能
  • 使用场景:插入日志,函数执行时间统计,函数前后操作处理,权限校验,缓存等
  • 万能装饰器模板:


def get_fun(func):? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ------外部函数,参数是传入的原函数
? ? def call_fun(*args.**kwargs):? ?? ?? ?? ?? ???------内部函数,是装饰后函数的引用
? ?? ?? ? print("增加功能“)? ?? ?? ?? ?? ?? ?? ?------为原函数添加功能的代码
? ?? ?? ? return func(*args,**kwargs) ------原函数的调用,return可返回原函数的返回值
? ? return call_fun? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ------外部函数返回内部函数,指向装饰后的函数

  • 装饰原函数后模板:


@get_fun? ?? ?? ?? ?? ? -----test= get_fun(test),调用外部函数,返回内部函数赋给装饰后的函数
def test(*args,**kwargs):? ?? ?? ?? ?? ?? ?------和func和call_fun的参数三者一致
? ???print("原功能”)? ?? ?? ?? ?? ?? ? ------原函数的功能代码
test(**,***)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???-----装饰后函数的调用,参数必须满足原函数参数内容

  • 多个装饰器装饰同一个函数:(按照秋裤大法和电梯大法)


@装饰器A? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
@装饰器B
def test(*args,**kwargs)
? ?? ?print("原功能”)
test(**,***)
实现过程解释:代码由上往下执行,每个装饰器由于要调用原函数,所以要在下一句代码找? ?? ???
原函数,装饰器A找不到,则暂停不调用执行,继续往下走。直到装饰器B下面为原函数,则? ?? ???
调用B装饰器外部函数返回B内部函数的引用,这时装饰器A下面有函数的引用了,调用该引
执行A装饰器外部函数,返回A装饰器的内部函数给装饰AB后的新函数,再次调用新函数实
现功能的增加。

  • 扩展:类装饰器


模板:
class Test(object):? ?? ?? ?? ?? ?? ?? ?? ?------创建类装饰器的类
? ? def __init__(self,func):? ?? ?? ?? ?? ? ------把原函数引用传进初始化方法作为实例属性
? ?? ???self.func = func
? ? def __call__(self):? ?? ?? ?? ?? ? ------当test()自动调用该方法,实现功能增加及函数调用
? ?? ???print(“新功能”)
? ?? ???self.func()? ?? ?? ?? ?? ??
@Test? ?? ?? ? ------test = Test(test)等同于使用类Test创建了一个对象test()再赋给test函数
def test():
? ? print("原功能")
test()

更多技术资讯可关注:gzitcast

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读