Python学习系列之装饰器
装饰器的作用
装饰器用于装饰某个函数、方法或者类,它可以让这个函数执行之前或者执行之后做一些操作
手工实现一个装饰器
- def outer(some_func): #装饰器 $1
- def inner():
- print("before some_func")$3
- ret = some_func() $2
- print('after some_func') $4
- return inner
- def foo(): #被装饰的函数
- print(1)
- decorator = outer(foo) #把foo函数当做参数传给outer函数 $5
- decorator() #在执行函数
让我们一步步来分析
1.outer函数是装饰器
2.foo函数是被装饰
3.$5处把foo函数当做参数传进outer函数
4.$1处outer函数接收foo函数这个参数
5.$2处inner函数接收outer函数传进来的参数(此例子为:foo函数),ret用来接收foo函数的结果.(inner函数在本函数内找some_func参数找不到就会向上一级找,就找到了,这是python的作用域(闭包),)
6.$3处是在foo函数的结果之前加一段代码,$4处是在foo函数的结果之后加一段代码
所以说原理就是把函数传到装饰器函数里,被装饰函数执行之前先执行一段你想执行的diamante,被装饰函数执行之后再执行一段你想执行的代码
利用装饰器装饰一个函数
定义被装饰函数
- 代码:
- #!/usr/bin/env python
- # _*_ coding: utf-8 _*_
- def foo(arg): # 接受一个参数arg
- print(arg) # 输出这个参数
- foo("Hello World!") # 调用脚本并且传入参数
现在要在foo函数执行之前和执行之后来执行一些操作
- #!/usr/bin/env python
- # _*_ coding: utf-8 _*_
- def decorator(func): # 创建一个装饰器函数,接受的参数arg参数就是func函数名
- def inner(*args, **kwargs):
- print("执行函数之前")
- ret = func(*args, **kwargs)
- print("执行函数之后")
- return ret
- return inner
- @decorator # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
- def foo(arg):
- print(arg)
- foo("Hello World!") #执行函数,测试
测试结果
- 执行函数之前
- Hello World!
- 执行函数之后
多个装饰器装饰同一个函数
- #!/usr/bin/env python
- # _*_ coding: utf-8 _*_
- def decorator1(func):
- def inner():
- print("开始之前执行装饰器01")
- ret = func()
- print("结束之后执行装饰器01")
- return ret
- return inner
- def decorator2(func):
- def inner():
- print("decorator2>>>Start...")
- ret = func()
- print("decorator2>>>End...")
- return ret
- return inner
- @decorator1
- @decorator2
- def index():
- print("执行函数...")
- index()#执行函数测试
结果
- 开始之前执行装饰器01
- decorator2>>>Start...
- 执行函数...
- decorator2>>>End...
- 结束之后执行装饰器01
Python学习系列之装饰器的更多相关文章
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- Python学习——迭代器&生成器&装饰器
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...
- 从零开始的Python学习Episode 11——装饰器
装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- Python学习日记(九) 装饰器函数
1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...
- Python 学习 —— 进阶篇(装饰器、类的特殊方法)
Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例: def log(f): def fn(x): print ' ...
随机推荐
- JS获取服务器端控件ID
很多时候我们需要在JS中对服务器端控件进行一些简单处理,但是这个时候没有必要回发到服务器,让服务器去处理,这个时候就又要用到JS了 那么怎么去获取这个服务器端控件呢?我们知道服务器最终返回到用户界面的 ...
- VUE 入坑系列 一 事件
html代码 <div id="app"> <button v-on:click="counter += 1">加1</butto ...
- Node.js——render封装
封装 挂在到res上
- SQLite busy handler
SQLite doesn't support high concurrency. In case of a lot of concurrent access from multi-process or ...
- C#斐波那契数列递归算法
public static int Foo(int i) { if (i < 3) { return 1; ...
- 【分享】4412开发板POP烧写ubuntu出错,如何挂载emmc分区解决方法
本文转自:http://bbs.topeetboard.com 平台:4412精英版系统:ubuntu系统 按照教程烧写ubuntu文件系统,TF卡和EMMC分区都完成(总之之前的操作试了几遍都是没问 ...
- codeforces_1066_B.Heaters
题意:一个数组只含有0或1,1表示该元素可以覆盖其自身.左边r-1个元素和右边r-1个元素,问最少保留多少个1元素可以覆盖整个数组. 思路:一个指针指向当前未被覆盖的最左边的元素下标,每次找离它最远且 ...
- Oracle反向字符截取逗號分隔字符串
DECLARE M ); BEGIN FOR I IN ( WITH T AS (SELECT REVERSE('i,am,a,test,hahahhah') AS STR FROM DUAL) SE ...
- jekyll 将纯文本转化为静态网站和博客 静态网站生成器
jekyll 将纯文本转化为静态网站和博客 静态网站生成器 这个貌似对windows 支持不是很好~ 但是有支持,官方说不建议使用
- Mysql使用遇到的问题(一)
1.在使用MySQL的时候,已经新建好了表,插入数据的时候报这个错误: Incorrect string value: '\xE5\xAF\x92\xE6\xB1\x9F...' for column ...