python学习-day20、装饰器【图片缺失可看】印象笔记博客备份
前言:
装饰器用于装饰某些函数或者方法,或者类。可以在函数执行之前或者执行之后,执行一些自定义的操作。
1、定义:装饰器就是一个函数,为新定义的函数。把原函数嵌套到新函数里面。以后就可以在执行新函数的过程中,同时执行旧函数,实现自定义操作。
装饰器的语法:
2、应用装饰器:@符号
1.1 无参数的装饰器
#装饰器架构:
def outter(func):
def inner():
print('hello world')
print('hello world')
print('hello world')
r=func()
print('end')
print('end')
print('end')
return r
return inner @outter
def f1():
print('F1')
>>>
hello world
hello world
hello world
F1
end
end
end
#开放封闭原则:不在原函数的修改代码基础上,实现函数执行前后新的功能
#装饰器架构: def outter(func):
#原来那个f1函数
def inner():
print('hello world')
print('hello world')
print('hello world')
#原f1函数
r=func() #r=None r=f1()
print('end')
print('end')
print('end')
return r #f1=inner →f1()=inner()
return inner
#@outter
def f1():
print('F1') #1、执行outter函数,并且将其下面的函数名(f1)当做参数传入装饰器内:f1=func
#2、将outter的返回值,重新赋值给f1→相当于f1执行另一个函数【相当于f1=inner内存地址】所以f1()相当于执行inner()
#新f1函数拿到一个return值:r f1=r
#总结:
# 把原函数分装到另一个函数里面。在不改变原函数的基础上。在原函数执行前,后操作其他内容。
#拆解过程
f2=outter(f1) #f2=inner()的内存地址
result=f2() #执行inner函数,并把返回值赋值给result
print(result) #打印执行结果
#然后把f1进行重新赋值。f1=f2 相当于:f1执行inner函数
>>>
hello world
hello world
hello world
F1
end
end
end
None
总结:
1、只要函数应用上装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数
1.2 带2个参数的装饰器
缺点:
原函数有几个参数,装饰器就得有几个参数,很不方便。所以可以考虑引入可变参数和关键字参数。*args,**kwargs.这样可以接受无限多的参数。
这样无法满足对于参数的灵活控制。希望写一个装饰器就可以应用到多个函数。
如果inner函数可以接收任意个参数的话,就无需其他函数强制修改为何装饰器一致参数的工作。
1.3、多个参数的装饰器
通过装饰器可变参数,可以解决大部分参数问题。
不足点:只能实现多个函数调用一个装饰器。如果一个函数调用多个装饰器?
1.4、一个函数调用多个装饰器。
1.5、装饰器流程梳理
①、函数应用一个装饰器
原函数等价于→inner函数。func是原来的index函数
@outer的意思:
1、执行outer函数,将index函数作为参数传递。
2、将outter的返回值。重新赋值给index
执行流程:
单层:
做个类比:
@outter+index=inner函数
两层装饰器函数
python学习-day20、装饰器【图片缺失可看】印象笔记博客备份的更多相关文章
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
- Python学习 :装饰器
装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...
- python学习之-- 装饰器
高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 ...
- Python学习笔记--装饰器的实验
装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...
- 6月4日 python学习总结 装饰器复习
1. 装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2. 装饰器的基本 ...
- python学习 day13 装饰器(一)&推导式
装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...
随机推荐
- 浅谈 js字符串 trim 方法之正则篇
关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格 等等.什么 \s 支持 中文空格?是的. 打开 Re ...
- JavaScript Array对象 知识点总结
1 isArray方法 该方法是Array对象的静态方法,用来判断一个值是否为数组,它可以弥补typeof运算符的不足. 用法是Array.isArray(array实例) 通用的判断对象数据类型的方 ...
- 结构体类型定义(C语言)
结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种:1.先定义结构体,再定义变量: eg. struct student{ char name[10]; ...
- [转]unity3d 脚本参考-技术文档
unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...
- 2016 - 1 - 23 xml解析 -- 语法简介
一: XML的概念 1. 一种可拓展标记语言 2. 与json一样,也是一种常用的数据交互格式 3. 一般也叫XML文档---XML Document 二: XML语法 1.一个完整的XML文档一 ...
- 转 纯CSS设置Checkbox复选框控件的样式
Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...
- ffmepg-nginx-nginx-rtmp-module配置脚本
把上个月写的的配置脚本贴一下: #!/bin/bash #version:-- #create by itn #dis: this is used to auto install ffmpeg+ngi ...
- 正则验证 手机号 QQ号和邮箱
+ (BOOL) validateEmail:(NSString *)email{ NSString *emailRegex = @"^[\\w-]+(\\.[\\w-]+)*@[\\ ...
- Oracle数据库初级学习
第一天 SQL查询语句 CMD——SQLPLUS----账号 soctt 密码 tiger,输入完成后进入SQL数据库,如图显示即连接成功. 连接成功后 ,我们首先设置一下基本界面, --设置 每列显 ...
- Apache Jena - A Bootstrap
前言 这篇文档属探究立项性质,作为语义网和本体建模工作的延续. 依照NoSQL Distilled上的考察方法,将Apache Jena作为图数据库的泛型考察. 内容 多种出版物上声明主要有四类N ...