提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
要实现在不修改原函数的情况下,来对函数进行扩展。
创建实现特定功能的函数
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执行结束~~~
总结
实现在不修改原函数的情况下,来对函数进行扩展,装饰器是一个在生产开发中很好用的方式。