本章讨论的话题

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第七章函数装饰器和闭包学习记录的更多相关文章

  1. 《流畅的Python》第三部分 把函数视作对象 【一等函数】【使用一等函数实现设计模式】【函数装饰器和闭包】

    第三部分 第5章 一等函数 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 在Python中,所有函数都是一等对象 函数是对象 函数本身是 func ...

  2. 简学Python第四章__装饰器、迭代器、列表生成式

    Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...

  3. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  4. Python: 无参数的函数装饰器

    写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...

  5. Python带参数的函数装饰器

    # -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...

  6. 流畅的python学习笔记第七章:装饰器

    装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ...

  7. python之路(九)-函数装饰器

    装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...

  8. Python 函数装饰器和闭包

    装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px ...

  9. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

随机推荐

  1. node中--save跟--save--dev

    --save参数表示将该模块写入dependencies属性, --save-dev表示将该模块写入devDependencies属性.   dependencies字段指定了项目运行所依赖的模, d ...

  2. 部署Nginx

    部署Nginx #下载nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz#安装依赖 yum install pcre-devel open ...

  3. Longest Substring Without Repeating Characters——经典题

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  4. centos安装更新Python2.7以及pip的安装

    一.首先对相关的软件进行更新 python -V yum -y update yum groupinstall -y development yum install -y zlib zlib-dev ...

  5. Jmeter+Jenkins持续集成(Ant运行脚本)

    Jmeter接口测试脚本运行后生成的是jtl(xml)格式的文件,这些文件不具备可读性,所以我们要把他转化为可以阅读的html格式报告. Ant是一个功能强大的打包编译工具.我们使用他的目的是将xml ...

  6. prometheus 结合 kubernetes时,提示User cannot list services at the cluster scope.如何解决?

    这表示认证这一阶段已通过,赋权未到位. 但kube-prometheus是一体化,全家桶安装,我试过几次自定义clusterRole,binding,都解决不完全. 于是来个快刀. 搞定. kubec ...

  7. Linux下服务器搭建

    一.安装前准备工作 yum -y install gcc   yum -y install gcc-c++   yum -y install make yum -y install ncurses-d ...

  8. (翻译)与.NET容器映像保持同步

    原文:https://blogs.msdn.microsoft.com/dotnet/2018/06/18/staying-up-to-date-with-net-container-images/ ...

  9. Pythonic和语法糖

    Pythonic就是以Python的方式写出简洁优美的代码. 用Python独有的语法写Python语言. 知乎:https://www.zhihu.com/question/20244565 某博客 ...

  10. POJ 3660 Cow Contest (dfs)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11129   Accepted: 6183 Desc ...