开放封闭原则:不改变调用方式与源代码上增加功能

'''
1.不能修改被装饰对象(函数)的源代码(封闭)
2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放)
'''

View Code

装饰器

# 把要被装饰的函数作为外层函数的参数通过闭包操作后返回一个替代版函数
# 被装饰的函数:fn
# 外层函数:outer(func)  outer(fn) => func = fn
# 替代版函数: return inner: 原功能+新功能def fn():print("原有功能")# 装饰器
def outer(tag):def inner():tag()print(新增功能")return inner
fn = outer(fn)              fn()

语法糖@外层函数

def outer(f):def inner():f()print("新增功能1")return innerdef wrap(f):def inner():f()print("新增功能2")return inner              @wrap  # 被装饰的顺序决定了新增功能的执行顺序
@outer  # <==> fn = outer(fn): inner
def fn():print("原有功能")

View Code

有参有返的函数被装饰

def check_usr(fn):  # fn, login, inner:不同状态下的login,所以参数是统一的def inner(usr, pwd):# 在原功能上添加新功能if not (len(usr) >= 3 and usr.isalpha()):print('账号验证失败')return False# 原有功能result = fn(usr, pwd)# 在原功能下添加新功能# ...return resultreturn inner@check_usr
def login(usr, pwd):if usr == 'abc' and pwd =='123qwe':print('登录成功')return Trueprint('登录失败')return False# 总结:
# 1.login有参数,所以inner与fn都有相同参数
# 2.login有返回值,所以inner与fn都有返回值"""
inner(usr, pwd):res = fn(usr, pwd)  # 原login的返回值return reslogin = check_usr(login) = innerres = login('abc', '123qwe')  # inner的返回值
"""

装饰器最终写法

def wrap(fn):def inner(*args, **kwargs):print('前增功能')result = fn(*args, **kwargs)print('后增功能')return resultreturn inner@wrap
def fn1():print('fn1的原有功能')
@wrap
def fn2(a, b):print('fn2的原有功能')
@wrap
def fn3():print('fn3的原有功能')return True
@wrap
def fn4(a, *, x):print('fn4的原有功能')return Truefn1()
fn2(10, 20)
fn3()
fn4(10, x=20)

转载于:https://www.cnblogs.com/king-home/p/10679729.html

Python学习之路——装饰器相关推荐

  1. Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...

  2. Python学习之路--装饰器

    三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...

  3. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  4. python正则表达式生成器_Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器,def login_decorator(fun ...

  5. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  6. Python学习笔记:装饰器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. [转载] python学习笔记——@property装饰器

    参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...

  8. python学习笔记之——装饰器及对象

    1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...

  9. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

最新文章

  1. 轻松python专题--文本
  2. python中abc属于字符串吗_Python基础学习:字符串
  3. 设计模式五: 原型模式(Prototype)
  4. 常用有话帧检测技术(VAD)
  5. Angular消息通知组件ngx-notification
  6. 华为HCIE7-中间系统到中间系统的路由泄露、防环、认证和优化机制
  7. 三菱st语言编程实例_C语言编程实例39
  8. 微软利用升级来监控你的电脑--删除方法
  9. Atitit 高性能架构法艾提拉著作 目录 1. 前期可以立即使用的技术 2 2. 分离法 3 2.1. Web db分离 3 2.2. 读写分离 4 2.3. CDN加速技术 4 2.4. 动静分
  10. Setup Factory 安装程序的图标
  11. 制作bin文件.c解读
  12. QQ坦白说_6.09前
  13. android实现箭头流程列表_Android弹出选项框及指示箭头动画选择
  14. www.idcnd.net传媒官方客服提供
  15. 11.3-11.4kmp专题训练
  16. python虚拟机管理系统_python 虚拟机 pdf
  17. Jekyll分页功能
  18. linux diff使用方法,Linux diff 使用教程
  19. 0413-0417数字资产每周数据速览 | TokenInsight
  20. 【FPGA黑金开发板】发布第二代黑金核心板 HJ-II-CORE

热门文章

  1. Docker在Ubuntu16.04上安装
  2. MORMOT数据库连接池
  3. Makefile 7——自动生成依赖关系 三颗星
  4. 华为机试题【10】-求数字基root
  5. 微软中国职位[北京工作]
  6. 西宁a货翡翠,孝感a货翡翠
  7. vue学习:7、路由跳转
  8. window.parent,top,window.self,parent,opener
  9. WPF 使用皮肤影响按钮自定义
  10. Xcode代码提示联想功能失效,按command键点不进去类库,提示“?”