# 装饰器:装饰器就是闭包的一个应用场景
# -- 外层函数与内存函数形成的闭包结构的一种综合使用
# def huaping():
# print('插花功能')
# 需求:如何拓展一个原有函数的功能
# -- 修改源代码
# -- 创建一个包含该功能和其他新功能的新函数
# 开放封闭原则:
# 开放:拓展功能的点是开放的 - 可以为之前的函数添加新功能
# 封闭:1.不能改变原函数的源代码 2.还有通过原函数的函数对象来调用函数
# 错误一:修改了源代码
# def huaping():
# print('插花功能')
# print('观赏功能')
# huaping()
# 错误二:改变了调用方式
# def huaping():
# print('插花功能')
# def my_huaping(fn):
# fn()
# print('观赏功能')
# my_huaping(huaping)
# 装饰器:满足开放封闭原则还能拓展新功能,简单
'''
def huaping():
print('插花功能')
temp = huaping
# temp = '呵呵'
def my_huaping():
temp()
print('观赏功能')
huaping = my_huaping
huaping()
'''
# 装饰器演变一:
'''
def huaping():
print('插花功能')
def outer(fn): # fn = huaping
# temp = huaping # 可以提取到实参对形参传递
def my_huaping():
fn()
print('观赏功能')
return my_huaping
huaping = outer(huaping) # 要整合该条逻辑
huaping()
'''
# 装饰器演变二:
def outer(fn): # fn = 原功能的huaping
def my_huaping(): # my_huaping => 新功能的huaping
fn()
print('观赏功能')
return my_huaping
@outer # huaping = outer(huaping) 被装饰的函数对象 = 装饰器外层函数对象(被装饰的函数对象)
def huaping():
print('插花功能')
huaping() # 被装饰后的my_huaping