装饰器就是对函数或者方法或者类进行修饰,增加其本身的功能,但是前提是在不改变原代码的基础上
第一种:函数装饰器装饰函数
用函数装饰函数
def decor(func):#函数名随便写
#声明内部函数来制作完整的装饰函数
def inner():#函数名随便写
print('高高兴兴去上学')
func()#相当于调用laxi()
print('兴高采烈回家去')
return inner
@decor#laxi = decor(gtschool)
def gtschool():
print('好好学习,天天向上')
#调用函数
gtschool()
上面代码你会发现,在没有改变原来函数的基础上,增加了函数的功能
并且,函数可以带有参数和返回值
如果想要使装饰器带有参数,来进行判断,装饰器函数外层需要再写一层函数outer()
第二种:类作为装饰器的函数,传入装饰器
#祝愿祈福类
class Wish:
#绑定类的方法
def before():
print('高高兴兴上学去')
#绑定类的方法
def after():
print('兴高采烈回家去')
#装饰器
def decor(cls):
def _decor(func):
#这是未来的拉稀函数
def __decor():
cls.before()
result = func()
cls.after()
return result
#返回装饰之后的函数
return __decor
return _decor
@decor(Wish)
def gtschool():
print('好好学习,天天向上')
return '我是小天才'
#调用函数
jg = htschool()
print(jg)
这一方法就是将类作为装饰器的参数传入函数,并且带有返回值
第三种:使用类作为装饰器
class Decor:
def __init__(self,arg):
#存入对象
self.arg = arg
#此魔术方法用于接收原函数
def __call__(self,func):
#将原方法存到对象当中
self.func = func
#返回装饰之后的函数
return self.mygtschool
#装饰函数
def mygtschool(self):
print('高高兴兴上学去')
#调用原函数
result = self.func()
print('兴高采烈回家去')
return result
@Decor(5)
def gtschool():
print('好好学习,天天向上')
return '我是小天才'
jg = gtschool()
print(jg)
将类作为装饰器使用,使用init,和call魔术方法,将实例化的对象作为函数来使用
第四种:为类添加装饰器
def zhuangshi(cls):
def inner():
print('你是谁?')
cls.say()
print('知道了吗?')
return inner
@zhuangshi
#类
class Human:
#用绑定类的方法
def say():
print('我是人类')
#实例化类
Human()
这种方法就是将第一种变形,装饰的实类,不是函数了
第五种:装饰器嵌套
def zhuangshi1(func):
def inner():
print('干什么呢?')
func()
print('哦~~知道了!!')
return inner
#装饰器2
def zhuangshi2(func):
def inner():
print('小子')
func()
print('干吧')
return inner
@zhuangshi2
@zhuangshi1
#函数
def say():
print('嘿嘿嘿~~~')
声明两个装饰器函数,叠加使用,注意运行的先后顺序
@语法糖的作用,本质是函数,相当于gtschool = zhuangshi(gtschool)