鱼C论坛

 找回密码
 立即注册
查看: 2220|回复: 0

[学习笔记] 装饰器的编写与使用

[复制链接]
发表于 2020-3-2 10:28:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 233倔强不秃 于 2020-3-5 01:13 编辑

# 创建几个函数

  1. def add(a , b):
  2.     '''
  3.         求任意两个数的和
  4.     '''
  5.     r = a + b
  6.     return r


  7. def mul(a , b):
  8.     '''
  9.         求任意两个数的积
  10.     '''
  11.     r = a * b
  12.     return r   
复制代码

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


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

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

# 只需要根据现有的函数,来创建一个新的函数
  1. def fn2():
  2.     print('函数开始执行~~~')
  3.     fn()
  4.     print('函数执行结束~~~')
复制代码

# fn2()   

  1. def new_add(a,b):
  2.     print('计算开始~~~')
  3.     r = add(a,b)
  4.     print('计算结束~~~')
  5.     return r

  6. # r = new_add(111,222)   
  7. # print(r)
复制代码

# 上边的方式,已经可以在不修改源代码的情况下对函数进行扩展了
#   但是,这种方式要求我们每扩展一个函数就要手动创建一个新的函数,实在是太麻烦了
#   为了解决这个问题,我们创建一个函数,让这个函数可以自动的帮助我们生产函数

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

  4.         参数:
  5.             old 要扩展的函数对象
  6.     '''
  7.     # 创建一个新函数
  8.     def new_function(*args , **kwargs):   #这里是参数装包
  9.         print('开始执行~~~~')
  10.         # 调用被扩展的函数
  11.         result = old(*args , **kwargs)        #这里是参数解包
  12.         print('执行结束~~~~')
  13.         # 返回函数的执行结果
  14.         return result

  15.     # 返回新函数        
  16.     return new_function

  17. f = begin_end(fn)
  18. f2 = begin_end(add)
  19. f3 = begin_end(mul)

  20. # r = f()
  21. # r = f2(123,456)
  22. # r = f3(123,456)
  23. # print(r)
复制代码


# 像begin_end()这种函数我们就称它为装饰器

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




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

  4.         参数:
  5.             old 要扩展的函数对象
  6.     '''
  7.     # 创建一个新函数
  8.     def new_function(*args , **kwargs):
  9.         print('fn3装饰~开始执行~~~~')
  10.         # 调用被扩展的函数
  11.         result = old(*args , **kwargs)
  12.         print('fn3装饰~执行结束~~~~')
  13.         # 返回函数的执行结果
  14.         return result

  15.     # 返回新函数        
  16.     return new_function
复制代码


# 指定多个装饰器会按照从内向外的顺序,这里就是先begin_end,再fn3

  1. @fn3
  2. @begin_end
  3. def say_hello():
  4.     print('大家好~~~')

  5. say_hello()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
zltzlt + 3 + 3 + 3 无条件支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 11:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表