美文网首页python基础
15.python装饰器进阶之功能与结构

15.python装饰器进阶之功能与结构

作者: 花间派I风月 | 来源:发表于2019-01-16 22:35 被阅读1次

1. 装饰器的主要功能和装饰器的固定结构

  • 在不改变函数调用方式的基础上在函数的前、后添加功能。

2. 装饰器的固定格式

2.1 装饰器的固定格式

def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner

2.2 wraps版装饰器固定格式

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

3. 带参数的装饰器

假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

一个一个的取消掉? 没日没夜忙活3天。。。

过两天你领导想通了,再让你加上。。。

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

# False时不装饰,True时装饰
@outer(False)
def func():
    print(111)

func()

4. 多个装饰器装饰同一个函数

def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner2

@wrapper2
@wrapper1 # 从下往上执行
def func():
    print('in f')

func()

当多个装饰器装饰同一个函数时,装饰器的运行顺序是从下到上的,比如上面这个f函数,装饰器运行的顺序应当是wrapper1 ->wrapper2

分析函数func的运行过程

  1. 传入wrapper1 的方法是func
  2. 传入wrapper2的方法是运行wrapper1返回的inner1
  3. 执行函数func
  4. 执行wrapper1 后续代码
  5. 执行wrapper2后续代码

相关文章

  • 15.python装饰器进阶之功能与结构

    1. 装饰器的主要功能和装饰器的固定结构 在不改变函数调用方式的基础上在函数的前、后添加功能。 2. 装饰器的固...

  • 装饰器详解

    装饰器基本写法: 高级一点的装饰器 带参数的装饰器和类装饰器属于进阶的内容。在理解这些装饰器之前,最好对函数的闭包...

  • Python装饰器-专题笔记

    学会装饰器,Python更进阶 函数作用域到闭包到装饰器讲解,及闭包和装饰器的运用。 [√] 慕课网Meshare...

  • Python基础中非常重要的一节:装饰器

    本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一...

  • Day05

    一、装饰器进阶 多个装饰器同时装饰一个函数,执行顺序是由上往下执行被装饰函数执行之前的操作,再执行被装饰函数,最后...

  • 十足干货|Python装饰器的从入门到高阶用法详解 !

    . 目录如下 装饰器语法糖入门用法:日志打印器入门用法:时间计时器进阶用法:带参数的函数装饰器高阶用法:不带参数的...

  • Python中的装饰器

    本文的内容主要参考了《Python进阶》一书 装饰器(Decorators)是什么? 我理解的装饰器,主要是设计模...

  • 一篇文章搞懂装饰器所有用法(建议收藏)

    本文的目录如下:装饰器语法糖入门用法:日志打印器入门用法:时间计时器进阶用法:带参数的函数装饰器高阶用法:不带参数...

  • Python装饰器(Decorator)完全指南-进阶篇

    Decorator进阶指南 在[python装饰器完全指南基础篇中],我们已经知道了python中的装饰器本质上只...

  • 装饰器模式

    原文:https://czkgo.github.io/2019/08/05/装饰器模式/ 简介 装饰器模式属于结构...

网友评论

    本文标题:15.python装饰器进阶之功能与结构

    本文链接:https://www.haomeiwen.com/subject/eorrdqtx.html