Python之装饰器

# 回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,
# 当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
def funa(fun):
    fun()  # 调用的是funb函数
    print('这是funa函数')

def funb():
    print('这是funb函数')

funa(funb)  # funb当作一个参数传递给funa()  fun==funb


# # 定义一个添加家具的函数
# def add(house):
#     house()  # 运行要传入的函数--》house1()
#     print('双人床')
# # 定义一个普通的函数
# # 需求:添加一张双人床
# def house1():
#     print('毛坯房')
#     print('两室一厅一卫')
#     print('装修完成,准备家具')
#
# add(house1)

'''
装饰器需要满足以下两点:  
1.不修改原程序或函数的代码
2.不改变函数或程序调用方法。
'''

'''
装饰器构成条件:
    1、在内部嵌套(函数里面再定义函数)的前提下
    2、内部函数使用了外部函数的变量或参数
    3、外部函数返回了内部函数的函数名
    4、外部函数的参数是以函数的形式使用的
'''

# 装饰器本质上就是一个闭包函数

# 定义一个添加家具的装饰函数
# def add(house):  # 外部函数
#     def inner():  # 内部函数
#         # 2、内部函数使用了外部函数的变量或参数
#         # 执行被装饰的函数(传入的函数)
#         h1 = house()  # house相当于调用house1()
#         print('双人床')
#         # 把这个新的函数作为本函数返回值返回出去
#         return h1
#     # 3、外部函数返回了内部函数的函数名
#     return inner
#
# # 被装饰的函数
# def house1():
#     print('毛坯房')
#     print('两室一厅一卫')
#     print('装修完成,准备家具')
#
# # 使用装饰器来装饰函数
# h1 = add(house1)  # house1当作一个参数传给add函数
# # 等价于执行装饰器里面的inner函数
# h1()  # --》执行闭包

# 语法糖
# 定义一个添加家具的装饰函数
def add(house):  # 外部函数
    def inner():  # 内部函数
        # 2、内部函数使用了外部函数的变量或参数
        # 执行被装饰的函数(传入的函数)
        h1 = house()  # house相当于调用house1()
        print('双人床')
        # 把这个新的函数作为本函数返回值返回出去
        return h1
    # 3、外部函数返回了内部函数的函数名
    return inner

# 定义一个打扫功能的装饰器
def clean(house):
    def inner():
        h1 = house()
        print('打扫中')
        return h1
    return inner

# 使用语法糖来装饰函数  语法:@装饰器的名称
@clean
@add

# 注意:是@add而不是@add(),@是装饰器的引用,add则是执行了这个函数
# 如果这个值不是一个装饰器的话会报错
# 注意:离被装饰的函数最近的装饰器先装饰,然后我们的装饰器再装饰
# 被装饰的函数
def house1():
    print('毛坯房')
    print('两室一厅一卫')
    print('装修完成,准备家具')

# 调用被装饰的函数
house1()

# 当装饰器中有两个形参
# 定义一个登录的装饰器函数 --》验证是否登录
def login(funa, funb):
    def inner():
        print('是否登录:已经登录成功!')
        # 执行被装饰的函数
        funa()  # funa实际上就是test1函数调用
        # 执行被装饰的函数
        funb()  # funb实际上是test2的调用
    return inner
# 被装饰的函数1  --》发表评论
def test1():
    print('发表评论:美女真好看!')\

# 被装饰的函数2  --》发朋友圈
def test2():
    print('发朋友圈:今天学了装饰器!')

# 调用login装饰
log = login(test1, test2)
# 调用装饰器里面的inner函数
log()

# 被装饰的函数无参数
# 定义装饰器函数
def outer(fun):
    def inner():
        # 执行被装饰的函数
        fun()
        print('这个是inner函数')
    return inner

# 使用语法糖装饰’
@outer
# 定义被装饰的函数
def func():
    print('这是func')
    print('这是被装饰的函数')

func()

# 被装饰的函数有参数
# 定义装饰器函数  --》打印相加的值
def outer(add1):
    def inner(a, b):
        print('相加的值:{},{}'.format(a, b))
        add1(a, b)
    return inner

@outer
# 被装饰的函数--》相加
def add(a, b):
    print(f'结果是:{a+b}')

add(1, 2)

# 被装饰的函数有不定长参数  *args **kwargs

# 定义装饰器函数
def outer(test1):
    def inner(*args, **kwargs):
        print('开始执行被装饰的函数')
        # 执行被装饰的函数 -->调用函数的时候也一样要写
        test1(*args, **kwargs)  # 因为可变参数不传参一样可以执行。传值也照样执行
        print('执行完成')
    return inner

# 定义被装饰的函数
def test(*args, **kwargs):
    print(args)
    print(kwargs)

# 调用outer装饰
ot = outer(test)
# 调用装饰器里面的inner函数
ot()
ot('123', '456', '789', age=18)

# 定义装饰器:实现的效果--》{(人生苦短,我学python)}
# 定义第一个装饰器 --》{}
def deco1(test1):
    def inner():
        return "{" + test1() + "}"
    return inner

# 定义第二个装饰器 --》()
def deco2(test1):
    def inner():
        return "(" + test1() + ")"
    return inner

# 使用语法糖
@deco1
@deco2
# 被装饰的函数 --》人生苦短,我学python
def test():
    return '人生苦短,我学python'

print(test())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值