首页 > 编程语言 > 详细

python的装饰器

时间:2020-03-26 22:20:16      阅读:47      评论:0      收藏:0      [点我收藏+]
1 - 创建了几个函数
def add(a , b) :
    ‘‘‘
        求任意两个数的和
    ‘‘‘
    r = a + b
    return r

def mul(a , b) :
    ‘‘‘
        求任意两个数的积
    ‘‘‘
    r = a * b
    return r

产生了一个需求,希望在调用这些函数的时候,

函数计算开始之前,打印“计算开始了...”,函数计算结束了以后,打印“计算结束了....”

2 - 第一个方法直接修改函数
def add(a , b) :
    ‘‘‘
        求任意两个数的和
    ‘‘‘
    print(‘计算开始....‘)
    r = a + b
    print(‘计算结束....‘)
    return r

def mul(a , b) :
    ‘‘‘
        求任意两个数的积
    ‘‘‘
    print(‘计算开始....‘)
    r = a * b
    print(‘计算结束....‘)
    return r

这么做有几个问题:

1 - 如果需要修改的函数过多,修改起来会比较麻烦。

2 - 并且不方便后期的变更和维护。

3 - 并且直接修改程序,会违法开发的开闭原则(OCP原则)

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

那么能不能在不,修改函数的情况下,对函数进行扩展呢?

3 - 新定义一个函数实现需求
def add(a , b) :
    ‘‘‘
        求任意两个数的和
    ‘‘‘
    r = a + b
    return r

def new_add(a,b):
    print(‘函数开始执行了....‘)
    r = add(a,b)
    print(‘函数执行结束了....‘)
    return r

r = new_add(123,456)

print(r)

这样做,实现了,但是有一个问题。

每次要扩展一个函数,就要重新定义一个函数,很麻烦。

4 - 装饰器
def add(a , b) :
    ‘‘‘
        求任意两个数的和
    ‘‘‘
    r = a + b
    return r

def mul(a , b) :
    ‘‘‘
        求任意两个数的积
    ‘‘‘
    r = a * b
    return r

# 创建一个函数,这个函数可以自动生成,扩展功能的函数。

def begin_end(old) :
    ‘‘‘
        这个函数,会对其他函数进行扩展,
        使其他函数可以在开始执行和执行之后,进行打印。

        参数 :
            old 要扩展的函数对象
    ‘‘‘

    # 这里是位置参数装包成元组,关键字参数装包成字典
    def new_function(*args,**kwargs) : 
        print(‘开始执行....‘)
        # 这里是元组拆包成位置参数,字典拆包成关键字参数
        result = old(*args,**kwargs)
        print(‘执行结束....‘)
        return result

    return new_function

f = begin_end(mul)
r = f(123,456)
print(r)
总结
‘‘‘
通过装饰器,可以在不修改原来函数的情况下,来对函数进行扩展。
在开发中,我们都是通过装饰器来扩展函数的功能的。
在定义函数时候,可以通过@装饰器,来指定使用的装饰器。
可以同时为一个函数指定多个装饰器。
这样,函数将会按照由内到外的顺序被装饰器装饰。
‘‘‘

@begin_end
@fn3
def say_hello() :
    print(‘大家好~~~~~~~‘)

python的装饰器

原文:https://www.cnblogs.com/gnuzsx/p/12577805.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!