装饰器的作用

装饰器用于装饰某个函数、方法或者类,它可以让这个函数执行之前或者执行之后做一些操作

手工实现一个装饰器

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学习系列之装饰器的更多相关文章

  1. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  2. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  3. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  4. python学习笔记:装饰器2

    python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...

  5. Python学习——迭代器&生成器&装饰器

    一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...

  6. 从零开始的Python学习Episode 11——装饰器

    装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...

  7. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  8. Python学习日记(九) 装饰器函数

    1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...

  9. Python 学习 —— 进阶篇(装饰器、类的特殊方法)

    Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例: def log(f): def fn(x): print ' ...

随机推荐

  1. IE和DOM事件流、普通事件和绑定事件的区别

    IE和DOM事件流的区别 IE采用冒泡型事件 Netscape(网络信息浏览器)使用捕获型事件 DOM使用先捕获后冒泡型事件 示例: <body> <div> <butt ...

  2. Log4j 配置某个类中某个方法的输出日志到指定文件

    我们在项目中使用log4j开发的时候,会遇到一些特殊的情况,比如:要输出某个类中某个方法的日志信息到文件中,方便以后查看 可以使用如下配置: log4j.rootLogger=info,stdout ...

  3. 手机信号强度单位:dBm 和 asu

    介绍 首先明确:dBm 和 asu 是两个独立的单位,它们的换算关系不唯一. 在 2G 网络下:dBm = -113+2*asu在 4G 网络下:dBm = -140+asu dBm 和 asu 都用 ...

  4. bat copy

    @echo off regedit /s %~dp0regedit.reg                                          //注册注册表xcopy "D: ...

  5. 在mac下做web开发,shell常用的快捷键

    Ctrl + A 光标移动到行首 Ctrl + E 光标移动到行末 Ctrl + K 清屏(也可是用clear命令) Command +shift+{} 终端的tab左右切换

  6. 02CSS基本语法

    CSS基本语法 id选择符 在HTML文档中,需要唯一标识一个元素时,就会赋予它一个id标识,以便在对整个文档进行处理时能够很快地找到这个元素. 而id选择符就是用来对这个单一元素定义单独的样式.#号 ...

  7. oracle调用存储过程和函数返回结果集

    在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql server 里比较好处理,直接返回查询结果就可以了,但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得 ...

  8. React Components之间的通信方式了解下

    先来几个术语: 官方 我的说法 对应代码 React element React元素 let element=<span>A爆了</span> Component 组件 cla ...

  9. 关于js事件冒泡和事件捕获

    事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获.true,事件捕获: ...

  10. CentO7-使用plantuml绘制UML类图

    准备工作 到PlantUml官网(http://plantuml.com/download)下载plantuml.jar.官网上还有一个在线的demof服务.plantuml的官网真的很挫! 到官网下 ...