python中闭包和装饰器
前言:
编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程。函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了。但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够,或者跟我们要实现的功能有些差别。肿么办呢?打开函数内部代码,重新写?可以吗?可以!但是这就违背了函数式编程思想的初衷,代码没有重复利用,而且还破坏了原有函数代码。怎么办?聪明的人类思想的灯泡再次闪亮,咔嚓一声霹雳响,闭包和装饰器诞生了!
闭包:
闭包的定义:
- 外部函数中定义了一个内部函数
- 内部函数中使用了外部函数的变量
- 外部函数将内部函数作为返回值返回
举例:
def wai(x):
def nei():
print(x)
return nei a = wai(3)()
在这个函数中,内部函数nei使用了外部函数的变量X,外部函数wai将内部函数作为返回值返回了。结果是3。a = wai(3)实际上是等同于a = nei ,后面价格括号,才是调用了函数nei。这就是为什么是a = wai(3)()
闭包知道咋回事了,那么它实际意义是啥呢?装饰器就是它的实际应用
装饰器:
装饰器本身是一个闭包,只不过外部函数的变量变成了一个函数名。
举例:
# 定义装饰器
def zhuang_xiu(fun):
def nei():
print('吊顶')
fun()
print('地毯')
return nei
#要被装饰器装饰的函数
def new_house():
print('新房')
print('使用装饰器前:')
new_house()
#使用装饰器
print('使用装饰器后:')
@zhuang_xiu
def new_house():
print('新房')
new_house()
运行结果:
使用装饰器前:
新房
使用装饰器后:
吊顶
新房
地毯
这样,我们就在没有改变newhouse函数源代码的前提下,增加了功能,实现了我们的目的。大家理解了吗?不理解可以评论联系我哦!
python中闭包和装饰器的更多相关文章
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
- Python中闭包、装饰器的概念
1.闭包(Closure)的概念: 内部函数中对enclosing作用域的变量进行引用 1 passline = 60 2 def func(val): 3 print('%x' % id(val)) ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- Python之闭包and装饰器
闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...
- python之闭包与装饰器
python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
随机推荐
- Vagrant 入门 - 项目设置
原文地址 配置 Vagrant 项目的第一步是创建 Vagrantfile 文件.Vagrantfile 文件的目的有两个: 设置项目的根目录.Vagrant 中的许多配置选项是相对于这个根目录的. ...
- Harbor - 私有企业级 Docker 镜像仓库
GitHub 地址 容器镜像服务 Docker镜像的基本使用 Docker:企业级私有镜像仓库Harbor使用 Harbor 是基于 Docker Registry 的企业级镜像仓库,安装后的使用方法 ...
- 理解jquery的$.extend()、$.fn.extend()【jQuery插件机制】
/** * 操作数据 | DOM 操作 * @description jQuery类添加类方法,可以理解为添加静态方法,将一个或多个对象的内容合并到目标对象 * @use $.fn.zhang() | ...
- 使用母版页的Web窗体不走Page_Load
原因:母版页--->属性--->生成--->输出路径,这里我将它的默认/bin路径更改了,所以才导致使用此母版页的其它页面也不走Page_Load方法 解决:改回默认的输出路径
- jQuery DataTables 问题:Cannot reinitialise DataTable
解决: destroy: true, var tabel = $('#userlist').DataTable({ destroy: true, ...
- C#计算两个日期的相隔天数
DateTime start = Convert.ToDateTime(dateStart.ToShortDateString()); DateTime end = Convert.ToDateTim ...
- 配置adb环境与简单命令
adb命令具有安装卸载apk,拷贝推送文件,查看设备硬件信息,查看应用程序占用资源,在设备执行shell命令等 客户端:通过adb调用客户端 服务器server:运行后台,负责客户端与进程进行通信 守 ...
- Show Me the Code
最近在练习写Python代码,拥有150多道程序员面试题的LeetCode注重算法的实现,锻炼思维,还能在线测试代码的正确性,而Python练习册涉及到了Python实际的应用,锻炼解决问题的能力,托 ...
- Linux:VIM简单入手
现在的Linux系统一般都会默认安装VIM编辑器,如果没有安装VIM编辑器,也默认一定会有VI编辑器,VI编辑器产生的时间比鼠标来的更早,虽然功能很强大,但我建议安装VIM工具,安装了VIM之后,VI ...
- [Python3] 022 面向对象 第二弹
目录 6. 面向对象的三大特性 6.1 封装 6.1.1 私有 private 6.1.2 受保护 protected 6.1.3 公开 public 6.2 继承 6.2.1 继承的概念与作用 6. ...