由浅入深,走进Python装饰器-----第二篇:进阶--函数装饰函数

上一篇:由浅入深,走进Python装饰器-----第一篇:基础



装饰器的使用种类:

# 第一种
@函数
   被装饰函数

# 第二种
@函数
    被装饰类

# 第三种
@类
    被装饰类

# 第四种
@函数
   被装饰函数


本篇介绍第一种

@函数
   被装饰函数

1.1 对带参数的原函数进行修饰

# 默认将old函数的参数传给outer里面的第一层函数
def outer(f):
    def inner(var):
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :",var)
        f(var)
        print("3 我是outer函数,我在old函数后显示")
    return inner
    def inner2(var):
        pass
@outer                                     #old = outer(old)
def old(var):
    print("2 我是old函数","参数: "var)

var = ‘音乐‘
old(var)

>>>1 我是outer函数,接收外部传进来的old :       <function old at 0x00000000024DAA60>
>>>1 我是outer函数,接收外部传进来的old的参数 : 音乐
>>>2 我是old函数, 参数:音乐
>>>3 我是outer函数,我在old函数后显示

1.2 对多参数的原函数进行修饰

def outer(f):
    def inner(a, b,*args,d,**kwargs):
        tmp = d                                            #通过变量接收命名关键字参数传进来的参数,然后再传递给内部调用的函数
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :            普通参数a={}, 默认参数b={}, 多余的普通参数:{}和{}".format(a,b,args[0],args[1]))
        print("1 我是outer函数,接收外部传进来的old的参数 :            命令关键字参数d:{}, 多余的关键字参数:{}和{}".format(d,kwargs["key1"],kwargs["key2"]))
        f(a,b, *args,d = tmp,**kwargs)
        print("3 我是outer函数,我在old函数后显示")
    return inner

@outer                                     #old = outer(old)
def old(a, b=2, *args,d,**kwargs):         #五种参数
    print("2 我是old函数",
        "普通参数a={0}, 默认参数b={1}, 多余的普通参数:{2}和{3},        命令关键字参数d:{4}, 多余的关键字参数:{5}和{6}"        .format(a,b,args[0],args[1],d,kwargs["key1"],kwargs["key2"]))

dict1 = {"key1":"value1","key2":"value2"}
old(1,22,‘args1‘,‘args2‘,d=4,**dict1)

>>> 1 我是outer函数,接收外部传进来的old :        <function old at 0x00000000024AAAE8>
>>> 1 我是outer函数,接收外部传进来的old的参数 :  普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :  命名关键字参数d:4, 多余的关键字参数:value1和value2
>>> 2 我是old函数 普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2,命名关键字参数d:4, 多余的关键字参数:value1和value2
>>> 3 我是outer函数,我在old函数后显示

1.3 对多参数的原函数进行嵌套修饰

def outer(f):
    def inner(a, b,*args,d,**kwargs):
        tmp = d                                            #通过变量接收命名关键字参数传进来的参数,然后再传递给内部调用的函数
        print("1 我是outer函数,接收外部传进来的old :",f)
        print("1 我是outer函数,接收外部传进来的old的参数 :            普通参数a={}, 默认参数b={}, 多余的普通参数:{}和{}".format(a,b,args[0],args[1]))
        print("1 我是outer函数,接收外部传进来的old的参数 :            命令关键字参数d:{}, 多余的关键字参数:{}和{}".format(d,kwargs["key1"],kwargs["key2"]))
        f(a,b, *args,d = tmp,**kwargs)
        print("3 我是outer函数,我在old函数后显示")
    return inner

@outer                         #old = outer(outer(old))
@outer                         #old = outer(old)
def old(a, b=2, *args,d,**kwargs):         #五种参数
    print("2 我是old函数",
        "普通参数a={0}, 默认参数b={1}, 多余的普通参数:{2}和{3},        命令关键字参数d:{4}, 多余的关键字参数:{5}和{6}"        .format(a,b,args[0],args[1],d,kwargs["key1"],kwargs["key2"]))

dict1 = {"key1":"value1","key2":"value2"}
old(1,22,‘args1‘,‘args2‘,d=4,**dict1)

>>> 1 我是outer函数,接收外部传进来的old :         <function outer.<locals>.inner at 0x00000000024FAAE8>
>>> 1 我是outer函数,接收外部传进来的old的参数 :   普通参数a=1,  默认参数b=22,  多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :   命令关键字参数d:4,  多余的关键字参数:value1和value2
>>> 1 我是outer函数,接收外部传进来的old :         <function old at 0x00000000024FAA60>
>>> 1 我是outer函数,接收外部传进来的old的参数 :   普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2
>>> 1 我是outer函数,接收外部传进来的old的参数 :   命令关键字参数d:4, 多余的关键字参数:value1和value2
>>> 2 我是old函数 普通参数a=1, 默认参数b=22, 多余的普通参数:args1和args2,命令关键字参数d:4, 多余的关键字参数:value1和value2
>>> 3 我是outer函数,我在old函数后显示
>>> 3 我是outer函数,我在old函数后显示

1.4 用带参数的装饰器函数 对 无参数原函数 进行修饰

def kuozhan(can_shu):
    def outer(f):
        tmp = can_shu
        def inner1():
            print("1 我是outer函数里的inner1,接收外部传进来的old :",f)
            f()
            print("3 我是outer函数里的inner1,我在old函数后显示")

        def inner2():
            print("1 我是outer函数里的inner2,接收外部传进来的old :",f)
            f()
            print("3 我是outer函数里的inner2,我在old函数后显示")
        if tmp == 1:
            return inner1
        else:
            return inner2

@kuozhan(2)                          # old = kuozhan(2)(old)    ==>      old = outer(old)
def old():
    print("2 我是old函数")

old()

>>> 1 我是outer函数里的inner2,接收外部传进来的old : <function old at 0x0000000001E8ABF8>
>>> 2 我是old函数
>>> 3 我是outer函数里的inner2,我在old函数后显示

1.5用带参数的装饰器函数 对 有参数原函数 进行修饰

def kuozhan(can_shu):
    def outer(f):
        tmp = can_shu
        def inner1(var):
            print("1 我是outer函数里的inner1,接收外部传进来的old :",f)
            print("1  我是outer函数里的inner1,接收外部传进来的old的参数 :",var)
            f(var)
            print("3 我是outer函数里的inner1,我在old函数后显示")

        def inner2(var):
            print("1 我是outer函数里的inner2,接收外部传进来的old :",f)
            print("1  我是outer函数里的inner2,接收外部传进来的old的参数 :",var)
            f(var)
            print("3 我是outer函数里的inner2,我在old函数后显示")
        if tmp == 1:
            return inner1
        else:
            return inner2
    return outer

@kuozhan(2)                         # old = kuozhan(2)(old)    ==>      old = outer(old)
def old(var):
    print("2 我是old函数,","我的参数是: ",var)
var = "音乐"
old(var)

>>> 1 我是outer函数里的inner2,接收外部传进来的old :        <function old at 0x00000000021CABF8>
>>> 1 我是outer函数里的inner2,接收外部传进来的old的参数 :  音乐
>>> 2 我是old函数,      我的参数是:  音乐
>>> 3 我是outer函数里的inner2,我在old函数后显示

原文地址:https://blog.51cto.com/dldxzjr/2378431

时间: 2024-11-07 15:27:55

由浅入深,走进Python装饰器-----第二篇:进阶--函数装饰函数的相关文章

由浅入深,走进Python装饰器-----第二篇:进阶--类装饰函数

**类装饰器** @类 函数 2.1 用类装饰器来扩展原函数 # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): def __call__(self,f): return self.newfunc(f) def newfunc(self,f): def in_newfunc(): print("1") f() print("2") return in_newfunc @KuoZhan() #1. KuoZ

1Python进阶强化训练之装饰器使用技巧进阶

Python进阶强化训练之装饰器使用技巧进阶 如何使用函数装饰器? 实际案例 某些时候我们想为多个函数,统一添加某种功能,比如记时统计.记录日志.缓存运算结果等等. 我们不想在每个函数内一一添加完全相同的代码,有什么好的解决方案呢? 解决方案 定义装饰奇函数,用它来生成一个在原函数基础添加了新功能的函数,替代原函数 如有如下两道题: 题目一 斐波那契数列又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21,-.,这个数列从第三项开始,每一项都等于前两项之和,求数列第n项. 题

由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

**类装饰器** @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): def __call__(self,cls): return self.newfunc(cls) def good(self): print("新增的方法!") def newfunc(self,cls): def in_newfunc(): cls.addpty = "新增的属性&q

python装饰器2:进阶

本文是装饰器相关内容的第二篇,接上一篇python函数装饰器详解. 函数装饰器装饰方法 函数装饰器装饰普通函数已经很容易理解了: @decorator def func():... #等价于 def func():... func = decorator(func) 如果装饰器是带参装饰器,那么等价的形式大概是这样的(和装饰器的编码有关,但最普遍的编码形式如下): @decorator(x, y, z) def func():... # 等价于 def func():... func = dec

python基础-第五篇-5.3装饰器

小白发呆的看着窗外,同事们陆陆续续的地来到公司,想起算法,小白就飘飘然了.突然后面传来一声呼唤,原来是小刘! 小刘:不好意思啊!堵车了,就来晚了点,不耽误你的时间,咱们就开启的今天的培训内容吧! 小白连忙说:没事,可以开始啦! 函数内存与执行函数 小刘:那我给你看一段代码,你看看会得到什么结果 def f1(): return 'F1' x = f1() print(x) x2 = f1 print(x2) 小白看了看,很快说出了x的输出值为‘F1’,但是看到x2这里,小白就有点想不通,小白就执

由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类

**函数装饰器** @函数 类 本篇只是用一个简单的例子,验证函数可以对类进行修饰, 但是由于返回的值为函数,并不是类, 而且改变了原有类的调用方式,所以没有实际应用的意义,就不深入探讨 3.1 用函数装饰器来扩展原类 def KuoZhan(cls): def new_func(): print("类里新增的方法new_func") def new_class(): cls.say = "类里新增的属性" cls.new_func = new_func cls.f

如何理解python中的装饰器, 这篇文章就够了!

1. python中的函数 理解裝飾器之前先要理解閉包, python中閉包的出現是因爲函數在python中也是一個對象, 也可以被引用, 然後調用, 比如 def log(): print('我是一些log信息') if __name__ == '__main__': print(type(log)) log_func = log log_func() 執行結果如下 <class 'function'> 我是一些log信息 可以看到log函數是一個對象, 可以被賦值給log_func, lo

python学习--装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

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

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰