Python_装饰器详解_万能装饰器_带返回值_带参数_双装饰器

目录:

一、装饰器详解
二、装饰器进阶
1、万能参数装饰器
2、带参数装饰器
3、带返回值装饰器
4、多个装饰器
创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!

一、装饰器详解

1.我们来看这是常规的函数执行方式、不带参数的,启动函数func()
在这里插入图片描述

2.这是需要参数的函数,启动的时候需要送个参数 outter(2)不一定是2可以是任意
在这里插入图片描述

3.下一步我们改造一下这个outter()函数,嵌套一个inner()函数。可以发现
程序只打印了一条数据“-- outter --” ,总所周知,程序正常都是自动向下运行
从25启动开始→20→跳过inner()函数→24.可能存在疑问,为什么跳过inner()执行?参考1
在这里插入图片描述
4.那么如何启动inner()函数了呢?只需这样再这样,这样这样QAQ…
从28行起 outter(2) 启动函数→20→跳过(21,22,23,24)为啥跳过参考1→25 打印 → 26 返回值 [outter(f) = inner]
→回到28 使得inner = inner→29 inner+() 字符拼接一样 组成了inner() 不就启动了吗?
→然后跳到22 23 执行打印 。就得到了如图结果,你品,你细细品?这品不会面壁思过
在这里插入图片描述
5.下一步将func()函数和outter()函数一起运用
32启动 通过outter(func)将func字符送入到outter函数→20 f 接受到32 得f = func
→跳过(21,22,23,24,25) 26 打印→27 返回inner字符到20 使得outter(f)= inner字符 →
32 outter(func) 即 outter(f) =inner 字符 inner =inner→→33 inner+()字符 便启动了
在这里插入图片描述
6、再调整下。。。。装饰器最终完成

注意!!!!!!

1、@outter 为装饰函数 也就是参考上面5 . 第32行 演化而来,使用的时候放到需要调用的函数前面 参考下面 29行

2、对照上面5 第32 33行下面 第33行 发现inner () 为啥改名字?
因为以上讲解方法实则为了理解!!!!!!!!!
真实情况应该修改成你需要装饰函数名称 也就是第33行
你可以不修改使用inner() 试试 会报错

在这里插入图片描述
在这里插入图片描述

返回文章目录

二、装饰器进阶

1、万能参数装饰器

基本格式:

def outter(f):

    def inner(*args,**kwargs):
        print(args) # --> ()
        print(kwargs) # -->{}
    return inner
@outter
def func():
    print("这是fucn函数")

func()

运用:

def outter(f):

    def inner(*args,**kwargs):
        print(args) # -->(10,20)
        print(kwargs) # -->{'name': '稳稳c9'}
        f()  #  -->这是func函数
    return inner

@outter  #func = outter(func)   func =  inner
def func():
    print("这是fucn函数")

func(10,20,name="稳稳c9")

在这里插入图片描述

2、带参数的装饰器

def outter(f):

    def inner(a,b):
        f(a,b)
    return inner

@outter
def func(a,b):
    print(a+b)
    print(f"这是fucn函数")

func(3,5)

在这里插入图片描述

3、带返回值的装饰器

def outter(f):
    def inner():
        f()
    return inner

@outter
def func():
    print(f"这是fucn函数")
    return "hello world"

func()

在这里插入图片描述

4、多个装饰器

# 多个装饰器的装饰过程
# 执行原理:先执行距离函数近的装饰器
def outter1(f):
    def inner1():
        print("--- berfore inner1 ---")
        f()
        print("--- after inner1 ---")
    return inner1


def outter2(f):
    def inner2():
        print("--- berfore inner2 ---")
        f()
        print("--- after inner2 ---")
    return inner2

@outter1 #  func = outter1(func)
@outter2 # func = outter2(func)
def func():
    print("---in func ---")
func()

在这里插入图片描述

返回文章目录

猜你喜欢

转载自blog.csdn.net/weixin_44238683/article/details/105860329