python全栈闯关--12-装饰器进阶

带参数的装饰器

装饰器使用过程中,如果需要一个参数来判断装饰器是否启用时,就需要传入一个参数,来判断是否启用。

目前装饰器,传输函数名给外部函数做参数,内部函数参数用做调用函数的参数,无法实现参数的传递。

因此,需要在加一层嵌套,来实现参数的传入,装饰器最多三层!!!

import time
from functools import wraps

FLAG = True

def out_warpper(flag):
    def warpper(f):
        @wraps(f)
        def w_in():
            if flag:
                print("this is warp!")
                ret = f()
            else:
                ret = f()
            return ret
        return w_in
    return warpper

# out_warpper = out_warpper(FLAG) → out_warpper = warpper
# func1 = warpper(func1) → func1 = w_in
@out_warpper(FLAG)  # func1
def func1():
    time.sleep(1)
    print("this is func1")

@out_warpper(FLAG)
def func2():
    time.sleep(1)
    print("this is func2")

func1()
func2()

三层时,先执行@符号后的行数,即out_warpper = out_warpper(FLAG) ,返回 out_warpper = warpper,闭包函数,存下了变量flag。

在执行@函数名,func1 = warpper(func1) ,返回func1 = w_in,从而实现了传参数的装饰器。

多个装饰器装饰一个函数

def warper1(f):
    def inner():
        print("begin do inner1!")
        f()
        print("after go inner1!")
    return inner

def warper2(f):
    def inner():
        print("begin do inner2!")
        f()
        print("after go inner2!")
    return inner

def warper3(f):
    def inner():
        print("begin do inner3!")
        f()
        print("after go inner3!")
    return inner

@warper3
@warper2
@warper1
def func():
    print("this is func")

func()

多个装饰器装饰一个函数,函数前,从最外层装饰器,执行到最内层 → 执行函数 → 在从最内层开始,往外执行

原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11721129.html

时间: 2024-08-30 16:22:21

python全栈闯关--12-装饰器进阶的相关文章

python全栈闯关--11-装饰器初识

1.装饰器形成 当不想修改原函数,未函数前后添加功能时,就可以使用装饰器,在函数前后增加功能. 装饰器的初始形成 import time def timer(f): def inner(): print("我是装饰器,我来装饰了!!!") start = time.time() f() end = time.time() print(start - end) return inner # 返回inner由于f实现了闭包,直接调用了程序 def func(): time.sleep(1)

16.python全栈之路:装饰器详解

装饰器 一.装饰器的意义 比如:以下函数是供我们调用的,但是我们需要在每个函数中都添加同一个功能,该如何做到呢? 方法一:在每个函数中都加上新加的功能代码块 def f1(): print("新功能") print("F1") def f2(): print("新功能") print("F2") def f3(): print("新功能") print("F3") def f4(): p

python全栈闯关--7-基础数据类型汇总、集合、深浅拷贝

1.str s = ' ' print(s.isspace()) # 如果字符串全是空格返回True 2.在循环一个列表时,最好不要删除列表中的元素 删除列表元素,得到的结果,往往不是预期的 例子1: lis = [11, 22, 33, 44, 55] # 循环开始后,按照索引递增,删除了前面的值,不会处理列表索引的位置 # 虽然没有报错,但是不是想要的结果 for i in lis: print("目前删除元素值为:%d " % i) print("值删除前:"

python全栈闯关--XX-细节总结汇总

1.The start value of slice is less than then end value,and the step is negative print("if the start value less then the end value and the step is negative ! " "No error will be reported and empty will be returned, ") for i in range(0,

python全栈闯关--5-字典

1.数据类型的划分 数据类型分为:可变数据类型,不可变数据类型 不可变数据类型:元祖.bool.int.str                    可哈希 可变数据类型:list,dic,set                                   不可哈希 2.dic的数据结构 dic key:必须为可哈希数据类型,不可以变数据类型 value:任意数据类型 dic 优点:二分查找,存储大量关系型数据 dic特点:3.6以前无序,3.6后有序 3.dic的增.删.改.查 定义

python全栈闯关--6-小知识点总结

1.python2和python3区别常用整理 # python2print 'abc'# 返回一个列表range()# 返回一个生成器值,不是list.每次只生成一个值,避免暂用很大的内存xrange() # 生成器# 输入raw_input(...) # python3print('abc')# 返回一个迭代值,需要生成列表就需要使用list(range(...))range()input(...) 2.复制 == 比较值是否相等 is 比较,比较的是内存地址 id(内容) >>>

python全栈闯关--10-2、函数的嵌套和作用域

1.全局作用域函数嵌套 def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c def two_max(a, b): return a if a > b else b print(three_max(1, 2, 3)) 程序执行,按照从下往下的顺序,把变量.函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错. 如上程序,如果把three_max的调用,交换到two_m

python全栈闯关--15-内置函数

1.作用域相关 print(locals()) print(globals()) # global 关键字,局部变量可以修改全局变量 # nonlocal 关键字,局部函数中,可以修改上一层函数中的变量 2.迭代器相关 next(迭代器) 等价与迭代器.__next__() 3.内置属相查看 dir 查看函数拥有的方法 4.帮忙 help 返回函数的帮助信息 5.程序调度相关 callable 判断函数是否可以执行,如果是函数返回true,是变量,放回false 6.文件操作相关 open 打开

python 基础篇 12 装饰器进阶

本节主要内容:1. 通?装饰器回顾2. 函数的有?信息3. 带参数的装饰器4. 多个装饰器同时装饰?个函数 ?. 通?装饰器的回顾开闭原则: 对增加功能开放. 对修改代码封闭装饰器的作?: 在不改变原有代码的基础上给?个函数增加功能通?装饰器的写法: 执行过程: 其实执行  target_func()就是执行inner函数.  inner函数会先执行目标函数之前的代码,然后执行目标函数,之后再执行目标函数之后的代码. 如何获取函数的有用信息: 函数名.__name__可以查看函数名字 函数名._