python_高阶函数(function)之装饰器

文章讲述了如何在不修改原函数的前提下,通过创建装饰器实现对函数的功能扩展,介绍了装饰器1和装饰器2的概念以及在实际开发中的应用,强调了装饰器在Python编程中的重要性。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

提示:这里可以添加本文要记录的大概内容:

要实现在不修改原函数的情况下,来对函数进行扩展。

创建实现特定功能的函数

def add(x, y):
    '''
        求任意两个数的和
    '''
    return x + y
def multipy(x, y):
    '''
        求任意两个数的积
    '''
    return x * y

此时要实现 以上功能函数在计算之前,打印开始计算,计算结束后打印计算完毕

实现方式1:通过直接修改该函数中的代码来完成该需求,但这种方式会产生一下问题

1、如果修改的函数过多,修改起来会比较麻烦

2、修改该函数这种方式不方便函数后期的维护

3、这种方式会违反开闭原则(OCP)

程序的设计,要求开放对程序的扩展,要关闭对程序的修改

实现方式2:

要实现在不修改原函数的情况下,来对函数进行扩展

def func():
    print('这个是原有功能函数....')

调用原函数

func()

输出结果:

这个是原有功能函数....

只需要根据现有的函数,来创建一个新的函数

def func2():
    print('函数执行开始')
    # 调用原函数
    func()
    print('函数执行完毕')

调用了原函数func 的新函数func2

func2()

输出结果:

函数执行开始
这个是原有功能函数....
函数执行完毕

对add() 函数进行装饰

def new_add(x, y):
    print('函数执行开始')
    # 调用原函数
    result = add(x, y)
    print(result)
    print('函数执行完毕')
    return result

执行函数

new_add(123, 456)

函数执行结果

函数执行开始
579
函数执行完毕

通过以上方式,已经可以实现在不修改源代码的情况下对函数进行扩展了

但,该方法要求每扩展一个函数就要手动创建一个新的函数,较为繁琐

为了解决此问题,可以创建一个函数,让这个函数可以自动的帮助我们来生成函数

实现方式3:

装饰器1

def begin_end(old_func):
    '''
        该函数用来对其它函数进行扩展,使其它函数可以在执行前打印开始执行,执行后打印执行结束
        参数:
            old:要扩展的函数对象
    '''

    # 创建一个新函数
    def new_function(*args, **kwargs):
        print('装饰器1执行开始~~~')
        # 调用被扩展的函数
        result = old_func(*args, **kwargs)
        print(result)
        print('装饰器1执行结束~~~')
        # 返回函数执行的结果
        return result

    # 返回新函数
    return new_function

装饰器2

def ZhuangShi(old):
    '''
        装饰器2
        参数:
            old: 要扩展的函数
    '''

    def new_function(*args, **kwargs):
        print('装饰器2执行开始~~~')
        result = old(*args, **kwargs)
        print(result)
        print('装饰器2执行结束~~~')
        # 返回函数执行的结果
        return result

    # 返回新函数
    return new_function

执行装饰器1

f = begin_end(add)
f(123, 456)

输出结果:

装饰器1执行开始~~~
579
装饰器1执行结束~~~
f2 = begin_end(multipy)
f2(12, 12)

输出结果:

装饰器1执行开始~~~
144
装饰器1执行结束~~~

begin_end()这种函数称之为装饰器

通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展

在开发中,是通过装饰器来扩展函数的功能的

在定义函数时,可以通过@装饰器,来使用指定的装饰器,来装饰当前的函数

可以同时为一个函数指定多个装饰器,这样函数将会按照从内向外的顺序被装饰

@begin_end
def say_hello():
    print("Hello")
    return "World"
say_hello()

输出结果:

装饰器1执行开始~~~
Hello
World
装饰器1执行结束~~~

使用两个装饰器来装饰函数,观察期装饰的先后顺序

@begin_end
@ZhuangShi
def say_name():
    print("*****")
    return "¥¥¥¥¥"
say_name()

输出结果:装饰器由内向外执行,装饰器2直接装饰函数,装饰器1 begin_end装饰了装饰器2和原函数

装饰器1执行开始~~~
装饰器2执行开始~~~
*****
¥¥¥¥¥
装饰器2执行结束~~~
¥¥¥¥¥
装饰器1执行结束~~~

总结

实现在不修改原函数的情况下,来对函数进行扩展,装饰器是一个在生产开发中很好用的方式。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值