python_装饰器

本文深入解析装饰器的概念,探讨其在不修改原函数的基础上如何增强功能。通过实例展示装饰器的多种应用,包括普通装饰器、带参数的装饰器及装饰带有返回值的函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器是什么?
定义:装饰器是用于拓展原函数功能的一种语法,返回新函数替换旧函数
作用:在不更改原函数代码的前提下,拓展出新功能
@语法:加上@符 系统会自动把下面的函数当成参数传递到装饰器中,从下到上.
@符又被称作语法糖
装饰器:
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值