python-装饰器(自我总结)

装饰器

1.装饰器的特点:

1.函数要作为参数
2.要有闭包的特点

2.装饰器的作用:

主要还是提高代码复用,在不改变原函数的情况下,对函数功能进行修改

3.举例一个简单的装饰器的例子

# 定义了一个装饰器
def decorate(func):  # 这里传进来的是一个函数
    def wrapper():
        func()
        print('铺地板')

    return wrapper


@decorate  # @装饰器函数   这个是必须写的
def house():  # 被装饰器修饰的函数
    print('毛坯房:')


house()
'''
@装饰器函数   之后,会执行以下步骤:
    1.将被装饰函数作为参数传递给装饰器
    2.然后会执行装饰器函数(会加载内部函数,因为还没有调用,所以只是加载)
    3.将装饰器的内部函数的地址返回给被装饰的函数名(也就是将wrapper函数的地址给了house)
    4.被装饰的函数进行调用(house()进行调用)
'''

4.原函数带有参数

# 不可变参数
def decrator(func):  # 装饰器
    def inner_func(x):  # 包装,装饰
        func(x)  # 调用被装饰函数
        print('装饰{}它为:包子'.format(x))

    return inner_func


@decrator
def func(x):
    print('装饰{}为:饺子'.format(x))


func('小谢')
'''
执行结果为:
装饰小谢为:饺子
装饰小谢它为:包子
'''
#可变参数    ----》 万能参数,在以后写代码时,就这么用
def decrator(func):  # 装饰器
    def inner_func(*args, **kwargs):  # 包装,装饰
        func(*args, **kwargs)  # 调用被装饰函数
        # ....

    return inner_func


@decrator
def func(*args, **kwargs):
    # ...
    pass
# 两层装饰器
def decrator1(func1):  # func1 = pri_func
    print('第一个装饰器')

    def inner_func():
        func1()
        print('第一个装饰器完毕')

    return inner_func


def decrator2(func2):  # func2 = func1
    print('第二个装饰器')

    def inner_func():
        func2()
        print('第二个装饰器完毕')

    return inner_func


@decrator2
@decrator1
def pri_func():  # 函数离哪个装饰器近,先装饰哪个
    print('开始装饰!')


pri_func()
'''
执行结果为:
第一个装饰器
第二个装饰器
开始装饰!
第一个装饰器完毕
第二个装饰器完毕
'''

5.装饰器带有参数

def decrator_outer(a):  # 接收 装饰器 参数
    # 原 装饰器
    def decrator(func):  # 接收 函数
        def wrapper(*args, **kwargs):  # 接收 函数参数
            func(*args, **kwargs)  
            print(a)# 调用被装饰函数,保持其原功能
        return wrapper
    # 返回原 装饰器
    return decrator
    
@decrator_outer(3)
def pri_func():
    pass

要叠加成三层。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值