装饰器:在某个方法执行前后去执行其他新定义的行为

例如:

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

def before_say_hello():
    print "before hello"

def after_say_hello():
    print "after hello"

def say_hello_wrapper(func):
    def wrapper():
        print "Before"
        before_say_hello()
        func()
        print "After"
        after_say_hello()
    return wrapper

@say_hello_wrapper
def say_hello():
    print "Hello!"

if __name__ == "__main__":
    say_hello()

执行结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py
Before
before hello
Hello!
After
after hello

Process finished with exit code 0

2.装饰器的执行步骤

(1)首先,装饰器本身也是一个函数,即say_hello_wrapper也是一个函数,也需要在执行前加入到内存

(2)当执行到@say_hello_wrapper时,即将say_hello()替换为say_hello_wrapper()里面的wrapper(), 即为相同的内存地址

(3)当执行到say_hello()时,则会执行say_hello_wrapper()

注意:使用debug模式可知装饰器的执行步骤

3. 带参数函数的装饰器

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

def before_say_hello():
    print "before hello"

def after_say_hello():
    print "after hello"

def say_hello_wrapper(func):
    def wrapper(content):
        print "Before"
        before_say_hello()
        func(content)
        print "After"
        after_say_hello()
    return wrapper

@say_hello_wrapper
def say_hello(content):
    print "Hello, {0}".format(content)

if __name__ == "__main__":
    say_hello("World")

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py
Before
before hello
Hello, World
After
after hello

Process finished with exit code 0

注意:只需将参数加入到wrapper()中即可,因为wrapper()为替换函数

4.带返回值函数的装饰器

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

def before_say_hello():
    print "before hello"

def after_say_hello():
    print "after hello"

def say_hello_wrapper(func):
    def wrapper(content):
        print "Before"
        before_say_hello()
        ret = func(content)
        print "After"
        after_say_hello()
        return ret
    return wrapper

@say_hello_wrapper
def say_hello(content):
    print "Hello, {0}".format(content)
    return content

if __name__ == "__main__":
    ret = say_hello("World")
    print ret

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py
Before
before hello
Hello, World
After
after hello
World

Process finished with exit code 0

老男孩python学习自修第十七天【装饰器】的更多相关文章

  1. 老男孩python学习自修第十八天【面向对象】

    1.类与对象(构造方法与实例化) #!/usr/bin/env python # _*_ coding:UTF-8 _*_ class Province: def __init__(self, nam ...

  2. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  3. python学习笔记-(八)装饰器、生成器&迭代器

    本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...

  4. python学习之路 六 :装饰器

    本节重点: 掌握装饰器相关知识 ​ python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函 ...

  5. python学习总结---函数使用 and 装饰器

    # 函数使用 ### 零碎知识 - 灵活的if-else ```python a = 3 if False else 5 print(a) ''' if False: a = 3 else: a = ...

  6. Python学习日记(七)——装饰器

    1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print ' ...

  7. Python学习基础(三)——装饰器,列表生成器,斐波那契数列

    装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...

  8. Python学习笔记(yield与装饰器)

    yeild:返回一个生成器对象: 装饰器:本身是一个函数,函数目的装饰其他函数(调用其他函数) 功能:增强被装饰函数的功能 装饰器一般接受一个函数对象作为参数,以便对其增强 @原函数名  来调用其他函 ...

  9. 老男孩python学习自修第二十四天【多进程】

    1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...

随机推荐

  1. 【转】svn冲突问题详解 SVN版本冲突解决详解

    (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲 ...

  2. Python:Day09

    Ubantu忘记密码: 1.开机长按shift,进入界面后按e: 2.将红框中内改成如下并按F10重启: 3.输入passwd,然后用户名,然后重新输入密码: locale命令查看系统中是否有中文 a ...

  3. ssm框架整合+Ajax异步验证

    SSM框架是目前企业比较常用的框架之一,它的灵活性.安全性相对于SSH有一定的优势.说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一.说到这两套框架的不同,主要是持久层框架Hi ...

  4. OpenCV3计算机视觉Python语言实现笔记(三)

    一.使用OpenCV处理图像 1.不同颜色空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV(Hue, Saturat ...

  5. Shell第一篇:BASH 环境

    一 什么是SHELL shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本.本节我们站在命令解释器的角度来阐述shell 命令解释器SHELL的发展历史,SH- ...

  6. Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路

    传送门--Luogu 传送门--Vjudge 设\(f_x\)为从\(x\)走到\(N\)的期望步数 如果没有可以不动的限制,就是隔壁HNOI2013 游走 如果有可以不动的限制,那么\(f_x = ...

  7. WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

    NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库.如此多的http库 ...

  8. Entity Framework Core系列之什么是Entity Framework Core

    前言 Entity Framework Core (EF Core)是微软推荐的基于.NET Core framework的应用程序数据访问技术.它是轻量级,可扩展并且支持跨平台开发.EF Core是 ...

  9. 使用 Emmet 生成 HTML 的语法详解

    生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 doctype.html.head.body 以及 meta 等内容.你只需要输入一个 “!” 就可以生成一个 HTML5 的标准文档 ...

  10. 十九、多文件上传(ajaxFileupload实现多文件上传功能)

    来源于https://www.jb51.net/article/128647.htm 打开google 搜索"ajaxFileupload' ‘多文件上传"可以搜到许许多多类似的, ...