def add(a , b) :
‘‘‘
求任意两个数的和
‘‘‘
r = a + b
return r
def mul(a , b) :
‘‘‘
求任意两个数的积
‘‘‘
r = a * b
return r
产生了一个需求,希望在调用这些函数的时候,
函数计算开始之前,打印“计算开始了...”,函数计算结束了以后,打印“计算结束了....”
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原则)
程序的设计,要求要开放对程序的扩展,关闭对程序的修改
那么能不能在不,修改函数的情况下,对函数进行扩展呢?
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)
这样做,实现了,但是有一个问题。
每次要扩展一个函数,就要重新定义一个函数,很麻烦。
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(‘大家好~~~~~~~‘)
原文:https://www.cnblogs.com/gnuzsx/p/12577805.html