装饰器是什么?
定义:装饰器是用于拓展原函数功能的一种语法,返回新函数替换旧函数
作用:在不更改原函数代码的前提下,拓展出新功能
@语法:加上@符 系统会自动把下面的函数当成参数传递到装饰器中,从下到上.
@符又被称作语法糖
装饰器:
1.普通装饰器
2.装饰带有参数的函数
3.装饰带有返回值的函数
4.带有参数的装饰器(不同函数不同效果)
5.把类作为装饰器(后面讲)
6.装饰类(后面讲)
# 公司有财务,销售,生产部门。 销售和生产部门需要资金就得和财务部门申请
# 批准拿下来才给相应的资金,开展对应的活动。
# 财务部门
def money():
print("给你钱")
print("还我钱!")
# 销售
def sell():
money()
print("销售有钱了卖东西")
sell()
# 生产
def make():
money()
print("生产有钱了就开始做东西")
# 使用闭包函数解决问题
# 财务部门
def decor(func):
def money():
print("给你钱")
func() # 调用原函数
print("还我钱!")
return money # 被装饰后的函数
# 销售
def sell():
print("销售有钱了卖东西")
sell = decor(sell)
sell()
# 上述代码就是装饰器的装饰过程
# 生产
def make():
print("生产有钱了就开始做东西")
make = decor(make)
make()
def decor(func1):
def money():
print("给你钱")
func1() # 调用原函数
print("还我钱!")
return money # 被装饰后的函数
# 销售
@decor # sell = decor(sell)
def sell():
print("销售有钱了卖东西")
sell()
# 上述代码就是装饰器的装饰过程
# 生产
@decor
def make():
print("生产有钱了就开始做东西")
make()
# 装饰带有参数的函数
# 装饰器
def make(func):
def new_sell(*arg,**kwargs):
print("给销售部门娃娃")
func(*arg,**kwargs) # 调用原函数
print("拿到钱之后继续制造娃娃")
return new_sell
# 基本函数(待装饰的函数)
@make
def sell(*arg,**kwargs):
for types in kwargs.values():
print("销售开始卖起了{}".format(arg),"娃娃的种类是{}".format(types))
sell("娃娃","布娃娃","洋娃娃","硅胶娃娃","老娃娃",sex="女娃娃",type= "可以陪你玩的娃娃")
#基础函数(被装饰的,带有返回值的函数)
# 装饰器
def decor(cash):
def inner(): # inner 是最终被装饰后的函数
print("做出了娃娃")
res = cash() # 原函数
print("拿到钱继续造娃娃")
return res
return inner
@decor # sell = decor(sell)
def sell():
print("销售部门卖起了娃娃")
return "可爱的娃娃"
res = sell()
print("============")
print(res)
# 带有参数的装饰器(不同函数不同效果)
# 装饰器
def out(name): # out 只是一个壳子,用来返回装饰器用的
def decor(func): # decor是真正的装饰器
def inner():
func()
if name == "屌丝":
print("在洗澡")
elif name == "高富帅":
print("好无聊啊,你陪我聊会天吧")
return inner
return decor
# 基本函数1
@out("屌丝") # @装饰器 diaosi = out(diaosi)
def diaosi():
print("女神在吗在吗在吗?")
# diaosi()
# 基本函数2
@out("高富帅")
def gfs():
print("在吗?")
gfs()
# 多个装饰器同时出现的情况,执行顺序是什么样的呢?
# 自下而上
# 装饰器1
def decor1(func):
def inner():
print("1号技师")
func()
print("1号按摩结束")
return inner
# 装饰器2
def decor2(func):
def inner():
print("2号技师")
func()
print("2号按摩结束")
return inner
# 基础函数
@decor1
@decor2
def mashaji():
print("按摩的感觉真爽~")
mashaji()
# 装饰器1
def decor1(func):
def inner(func2): #inner 是装饰后的decor2装饰器
print("1号技师")
decor = func(func2)
print("1号技师按摩结束")
return decor # decor 是decor2的inner函数
return inner
# 装饰器2
@decor1
def decor2(func):
print("技师们,我们来大生意了!")
def inner():
print("2号技师")
func()
print("2号技师按摩结束")
return inner
#基础函数(被装饰的函数)
@decor2
def mashaji():
print("马杀鸡真滴好嗨哟~")
mashaji()