python装饰器是干嘛的 就是现在又一个函数方法 不想改动他本身的代码 又想给他增加新的功能 就是装饰器 这样说比较笼统 大概就是这个意思
先来看代码
def w1(func): def inner(): print("---新增功能----") func() return inner @w1 def f1(): print("---原有功能---") f1()
f1本来功能只有一行的代码输出 w1就是装饰器 在f1前面加上@w1 就相当于给f1增加了装饰器 这样f1 就新增了w1的功能
这是最基础的装饰器
多个装饰器
需要新增的功能 太多了 一个装饰器搞不定 这么办 我们同样可以用多个装饰器
看代码
def makeBold(func): def inner(): print("----新增功能1---") func() return inner def makeItalic(func): def wrapped(): print("----新增功能2---") func() return wrapped @makeBold @makeItalic def test(): print("----基础的原有功能---") test()
两个装饰器 makeBold makeItalic 都对原有的test的功能进行了新增
现在有人说了 我原有的是带有参数的 希望对参数进行处理的 这么办 看代码
def func(functionName): def func_in(a, b): a=a+b functionName(a, b) return func_in @func def test(a, b): print("a====%d,b=%d===" % (a, b)) test(11, 22)
我们原有的函数 带有a和b两个参数 装饰器的内部函数 func_in(a,b) 来接受了两个参数 并且进行处理 然后又给了原有的函数 进行了装饰 在不改动原先代码的情况下 改变了a的值 最后结果 33 22
又有新需求 参数是不固定的 装饰器可以吗 看代码
def func(functionName): def func_in(*args, **kwargs):#采用不定长参数的方式满足所有函数需要参数以及不需要参数的情况 functionName(*args, **kwargs)#这个地方,需要写*以及**,如果不写的话,那么args是元祖,而kwargs是字典 return func_in @func def test(a, b, c): print("----test-a=%d,b=%d,c=%d---"%(a,b,c)) @func def test2(a, b, c, d): print("----test-a=%d,b=%d,c=%d,d=%d---"%(a,b,c,d)) test(11,22,33) test2(44,55,66,77)
不做过多解析 看不懂得话 请出门左转
我想给我得装饰器带参数 行不行 肯定行呀 上代码
def func_arg(arg): def func(functionName): def func_in(): print("---装饰器参数arg=%s--"%arg) if arg=="heihei": functionName() functionName() else: functionName() return func_in return func @func_arg("heihei") def test(): print("--test--") @func_arg("haha") def test2(): print("--test2--") test() test2()
大功告成 python装饰器学完了
我这里又python全套教学视频 免费领 直接评论就可以了