流畅的python第七章函数装饰器和闭包学习记录
本章讨论的话题
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第七章函数装饰器和闭包学习记录的更多相关文章
- 《流畅的Python》第三部分 把函数视作对象 【一等函数】【使用一等函数实现设计模式】【函数装饰器和闭包】
第三部分 第5章 一等函数 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 在Python中,所有函数都是一等对象 函数是对象 函数本身是 func ...
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- python语言中的函数装饰器
装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具 在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- Python带参数的函数装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...
- 流畅的python学习笔记第七章:装饰器
装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
- Python 函数装饰器和闭包
装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px ...
- Python函数装饰器高级用法
在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...
随机推荐
- 更换163的yum源
1.利用oss的文件目录形式进行各地项目的汇总保存.上报在A目录,统计过的放到B目录. 2.各地服务器健康状态检查,每5分钟检查项目, 如果有异常,就发短信+邮件进行汇报.不管是不是有异常,都以 ...
- PHP需要学习成长路径
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中型系统中支 ...
- AC日记——「SCOI2016」背单词 LiBreOJ 2012
#2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- T-SQL备忘(6):常用内置函数
日期和时间函数: 1.获取当前时间:GETDATE() select GETDATE() 返回: 2015-04-27 20:52:06.700 2.返回时间的部分(日.月.年) a.获取日: sel ...
- git 命令小结
一.git 版本管理 1.git log: 获取当前版本之前的所有操作 2.git log --pretty=oneline:获取当前版本的前三和后三个操作 3.git reflog :获取当前项目下 ...
- jquery&javascript 跨域jsonp
$(function(){ $.ajax({ type: "get", async: false, url: "http://flightQuery.com/jsonp/ ...
- idea优秀插件(Java开发常用)
http://blog.csdn.net/sujun10/article/details/72852939 1.findBugs-IDEA 可以查看代码中基础错误,这个eclipse中也有,操作也方便 ...
- 用python正则表达式提取网页的url
import re import urllib url="http://www.itokit.com" s=urllib.urlopen(url).read() ss=s.repl ...
- PowerShell 获取系统的硬件信息
1.获取系统的BIOS的信息: Get-WMIObject -Class Win32_BIOS 2.获取内存信息: Get-WMIObject -Class Win32_PhysicalMemory ...
- Python3 文件读写r,w,a
# Author;Tsukasa ''' f = open('yesterday','w') #文件句柄...注意open分为‘r’读模式,‘w’写模式(d会先创建文件或者覆盖文件),‘a’为追加模式 ...