码迷,mamicode.com
首页 > 编程语言 > 详细

流畅的python第七章函数装饰器和闭包学习记录

时间:2018-01-29 11:27:50      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:com   调用函数   rap   local   常见   技术分享   stat   判断   fun   

本章讨论的话题

python如何计算装饰器句法

python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量)

闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。函数中的函数)

nonlocal能解决什么问题(nonlocal是新出现的保留关键字,python3.0中引入)(将局部变量声明为自由变量)

探讨

实现行为良好的装饰器

标准库中有用的装饰器

实现一个参数化的装饰器

 

装饰器的基础知识

装饰器是可调用的对象,其参数是另一个函数即被装饰的函数,装饰器可能会处理被装饰的函数,然后将它发返回,或者将其替换成另一个函数或可调用对象。

@decorate
def target():
    print("running target()")

以上方法效果同下
def target():
    print("running target()")
target = decorate(target)

装饰器的一个特性是能把被装饰的函数替换成其他函数,第二个特性是,装饰器在加载模块是立即执行。

装饰器通常在一个模块中定义,然后应用到其他模块的函数上,并且会在内部定义一个函数,然后将其返回

变量作用域规则

技术分享图片

技术分享图片

在上面的例子中我们定义了一个全局变量b,在函数中给b赋值,导致python判断b是局部变量,我们只定义了全局变量b,没有定义局部变量b,所以报错。可以通过使用global关键词将b当成全局变量

 

 技术分享图片

 

LOAD_GLOBAL加载全局变量,LOAD_FAST加载局部变量

 闭包

闭包指的是延伸了作用域的函数,其中包含函数定义体中引用,但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是能访问定义体之外的非全局变量

技术分享图片

技术分享图片

技术分享图片

综上,闭包是一种函数,它会保留定义函数是存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。

nonloal声明

函数中的局部变量,虽然可以被函数中的函数使用,但是如果使用了赋值语句,就需要将该局部变量定义成自由变量,nonloal的作用就是把变量标记为自由变量。

Python2中没有nonlocal但是可以通过将声明一个变量指向局部变量来对其赋值

实现简单的装饰器

技术分享图片

技术分享图片

技术分享图片

标准库中的装饰器

python内置了三个用于装饰方法的函数,property,clasmethod和staticmethod

另一个常见的装饰器是functools.wraps,作用是协助构建行为良好的装饰器。

技术分享图片

技术分享图片

单分派泛函数

技术分享图片

技术分享图片

技术分享图片

技术分享图片

叠放装饰器

 使用两个或者多个装饰器

参数化装饰器

技术分享图片

技术分享图片

 

流畅的python第七章函数装饰器和闭包学习记录

标签:com   调用函数   rap   local   常见   技术分享   stat   判断   fun   

原文地址:https://www.cnblogs.com/lgh344902118/p/8375846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!