Python基础5: 装饰器

本文深入探讨了Python装饰器的原理和应用,包括通用装饰器、带参数的装饰器、多个装饰器的使用以及如何解除装饰器的影响。通过实例展示了装饰器如何在不修改原函数的情况下扩展其功能。

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

装饰器

通用装饰器、带参数的装饰器、函数使用多个装饰器、解除装饰器的作用(装饰器有副作用)

from functools import wraps

#装饰器:本质上是一个函数,在不改变原函数和调用的情况下,可以给原函数的功能进行扩展
#开闭原则:原函数不能变,调用也不能变,对扩展开发,对修改封闭
def f1(x):
    return x*x

def func_new(func):
    def fn(j):
        print('1'*10)
        #func(j)
        return func(j)
    return fn

f1 = func_new(f1)
print(f1(10)) #None,因为func(j)处没有返回值



def func_new1(func):
    def fn(j):
        print('1'*10)
        #func(j)
        return func(j)
    return fn
@func_new1
def f1(x):
    return x*x

print(f1(10))

#装饰器的写法
def decorator(func):
    def inner():
        print('-'*10)
        func()
    return inner

@decorator
def show(): #此处的show相当于inner
    print('abc')

show()

#通用装饰器
def decorator(func):
    def inner(*args, **kwargs):
        print('-'*10)
        return func(*args, **kwargs)
    return inner
@decorator
def sum_num(num1, num2):
    return num1+num2

@decorator
def f(num1, num2):
    return num1 * num2


print(sum_num(1, 2))
print(f(2,3))


#带有参数的装饰器
#实现部分函数前面打印---,部分函数前面打印***
#定义时,再包装一层
def decorator2(char):
    def decorator1(func):
        def inner(*args, **kwargs):
            print(char*10)
            return func(*args, **kwargs)
        return inner
    return decorator1

@decorator2('*')
def sum_num1(num1, num2):
    return num1+num2

print(sum_num1(3,4))




#函数使用多个装饰器
def decorator3(func):
    def inner3():
        print('-'*30)
        func() #aa
    return inner3

def decorator4(func):
    def inner4():
        print('*'*30)
        func() #bb
    return inner4

@decorator4 #show = decorator4(decorator3(show)) -->decorator4.inner4
@decorator3 #show = decorator3(show) --> decorator3.inner3
def show():
    print('aaaaa')

show() # 先打印---,再打印***,
# decorator4(decorator3(show))
# show传到 decorator3中的func,返回inner3,inner3传到 decorator4中的func,也就是说#bb处是inner3,返回inner4
#穿衣服,穿一层,再在外面套一层

#解除装饰器的作用
def decorator(func):
    @wraps(func)
    def inner(num1, num2):
        '''inner'''
        print('正在计算')
        func(num1, num2)
    return inner

@decorator
def sum_num(num1, num2):
    '''sum_num'''
    print(num1+num2)

sum_num(1,3)
#装饰器有副作用,改变原有函数的指向
print(sum_num.__doc__) #打印函数的文档说明,结果为inner;添加@wraps(func)后,结果为sum_num

sum_num.__wrapped__(1,3)#调用原有函数,装饰器失效

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值