人生与戏

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

装饰器:

作用: 在不改变原函数的情况下对函数进行扩展

   效果图:

   代码:

# 装饰器
#   通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
#   在开发中,我们都是通过装饰器来扩展函数的功能的
# 在定义函数时,可以通过 @装饰器 ,来使用指定的装饰器,来装饰当前的函数
#   可以同时为一个函数指定多个装饰器,这样函数将会安装从内向外的顺序被装饰

def begin_end(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束

        参数:
            old 要扩展的函数对象
    '''
    # 创建一个新函数    *args 参数(有就接收);**kwargs 关键字参数(有就接收)
    def new_function(*args , **kwargs):   # 参数 中包 成元组和字典
        print('开始执行~~~~')
        # 调用被扩展的函数
        result = old(*args , **kwargs)    # 参数 拆包成未知参数传进去、拆包成关键字参数传进去
        print('执行结束~~~~')
        # 返回函数的执行结果
        return result

    # 返回新函数        
    return new_function

@begin_end    # 无参数
def say_hello():
    print('你好,哈哈哈')

say_hello()

print('\n')

def add(a , b):   # 有参数
    '''
        求任意两个数的和
    '''
    r = a + b
    return r
    
sums = begin_end(add)
print(sums(4,7))

  学习来源代码:

# 创建几个函数

def add(a , b):
    '''
        求任意两个数的和
    '''
    r = a + b
    return r


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

# 希望函数可以在计算前,打印开始计算,计算结束后打印计算完毕
#  我们可以直接通过修改函数中的代码来完成这个需求,但是会产生以下一些问题
#   ① 如果要修改的函数过多,修改起来会比较麻烦
#   ② 并且不方便后期的维护
#   ③ 并且这样做会违反开闭原则(OCP)
#           程序的设计,要求开发对程序的扩展,要关闭对程序的修改


# r = add(123,456)
# print(r)

# 我们希望在不修改原函数的情况下,来对函数进行扩展
def fn():
    print('我是fn函数....')

# 只需要根据现有的函数,来创建一个新的函数
def fn2():
    print('函数开始执行~~~')
    fn()
    print('函数执行结束~~~')

# fn2()    

def new_add(a,b):
    print('计算开始~~~')
    r = add(a,b)
    print('计算结束~~~')
    return r

# r = new_add(111,222)    
# print(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(fn)
f2 = begin_end(add)
f3 = begin_end(mul)

# r = f()
r = f2(123,456)
# r = f3(123,456)
print(r)
# 向begin_end()这种函数我们就称它为装饰器
#   通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
#   在开发中,我们都是通过装饰器来扩展函数的功能的
# 在定义函数时,可以通过@装饰器,来使用指定的装饰器,来装饰当前的函数
#   可以同时为一个函数指定多个装饰器,这样函数将会安装从内向外的顺序被装饰 

def fn3(old):
    '''
        用来对其他函数进行扩展,使其他函数可以在执行前打印开始执行,执行后打印执行结束

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

    # 返回新函数        
    return new_function

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

say_hello()

 

posted on 2019-08-04 20:51  人生与戏  阅读(140)  评论(0编辑  收藏  举报