1,什么是装饰器
所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。
说到装饰器的那就要提一下闭包这个概念了
装饰器本质---闭包
当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外部被执行就产生了闭包.闭包是一个环境,具体指的就是外部函数--高阶函数。说白了就是一个环境,能够读取其他函数内部的变量
闭包形成的条件
1,存在嵌套关系,即有内部函数,外部函数
2,内部函数引用外部变量
3,外部函数返回内部函数
2,简单的装饰器
#!/usr/bin/env python # -*- encoding: utf-8 -*- # 定义一个函数 def PrintHello(): print('Hello the world!') PrintHello() print('----------------------------------') # 想要让这个函数多打印一句话,但是又不能改变这个函数,这个时候就需要定义一个装饰器 def Decorator(func): def inner(): print('这是需要加的话') func() return inner hello = Decorator(PrintHello) hello()
结果:
3,美化后的装饰器
#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' # 装饰器 def Decorator(func): def inner(): print('这是需要加的话') func() return inner # 定义一个函数 @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了 def PrintHello(): print('Hello the world!') PrintHello()
这里的@Decorator就好比 hello = Decorator(PrintHello)
4,带参数的装饰器
单个参数
#!/usr/bin/env python # -*- encoding: utf-8 -*- # 装饰器 def Decorator(func): def inner(args): print('这是需要加的话') func(args) return inner # 定义一个函数 @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了 def PrintHello(args): print(f'{args}:Hello the world!') PrintHello('Army')
多个参数
#!/usr/bin/env python # -*- encoding: utf-8 -*- # 装饰器 def Decorator(func): def inner(*args,**kwargs): print('这是需要加的话') func(*args,**kwargs) return inner # 定义一个函数 @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了 def PrintHello(args): print(f'{args}:Hello the world!') @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了 def PrintHello2(args,args2): print(f'{args}:Hello the world! {args2}') PrintHello('Army') PrintHello2('Army','123')