上一篇:由浅入深,走进Python装饰器-----第一篇:基础
装饰器可以嵌套使用
装饰器可以是类,也可以是函数; 装饰器可以修饰函数,也可以修饰类
装饰器的使用种类:
@函数
被装饰函数
@函数
被装饰类
@类
被装饰函数
@类
被装饰类
装饰器的嵌套: 下层装饰器修饰后的函数, 再次被上层装饰器修饰
def kuozhan(f): def inner(): print("1我是扩展函数,接收外部传进来的新old :",f) f() print("4我是扩展函数,我在新old函数后显示") return inner def outer(f): def inner(): print("2我是outer函数,接收外部传进来的old :",f) f() print("3我是outer函数,我在old函数后显示") return inner @kuozhan #old = kuozhan(outer(old)) @outer #old = outer(old) def old(): print("我是old函数") old() >>>1 我是扩展函数,接收外部传进来的新old : <function outer.<locals>.inner at 0x000000000250AB70> >>>2 我是外部传进来的old : <function old at 0x000000000250AAE8> >>> 我是old函数 >>>3 我是修饰工,我在旧函数后显示 >>>4 我是扩展函数,我在新old函数后显示
对带参数的原函数进行修饰
默认将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函数后显示
对多参数的原函数进行修饰
def outer(f): def inner(a, b,*args,d,**kwargs): 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=4,**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函数后显示