以下内容仅用于帮助个人理解装饰器这个概念,案例可能并不准确。

什么是装饰器?

我们知道iPhone 应用商店中有成千上万的APP,我们也知道苹果系统每年都会大版本更新增加很多新功能。这些功能要想发挥出来需要软件进行适配,如果全部让软件开发者去主动适配,难度很大。苹果要想保持软件的体验,要么强制开发者去适配,要么下架应用,当然如果苹果能在系统底层增加某些功能使得开发者不必亲自进行修改的话那自然是最好了,但我们还是经常看到软件更新说明中写到“适配IOS14”,说明这事需要开发者的参与。但我想,苹果肯定会从“自己在系统层面修改”和“让开发者自己修改”中作出平衡,自己能做的自己做,做不了的由开发者去做。

开放封闭原则

软件设计中有一个“开放封闭原则”,关于开放封闭原则,其核心的思想是:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
 
因此苹果要想增加新的功能,可能不会在系统底层上修改代码,应该是在原来基础上进行功能扩展。
而装饰器的功能就是在不改变原先功能调用的基础上,增加额外功能,就是说开发者不需要自己做出任何改变就能在目前基础上增加新的功能。
 
因此苹果可能需要一个装饰器。
 

怎么用装饰器

1 def func1():
2 print('func1')
3
4 def func1():
5 print('func2')
6
7
8 func1()
 
当我执行上述代码的时候,请问会输出什么结果?
答案是:func2
 
因为程序是自上而下运行的,后面的func1才是最终的func1
 
有了这个铺垫,我们先看一下装饰器的样子
 
 1 def outer(func):
2 def inner():
3 print("func_before")
4 r = func()
5 print("func_after")
6 return r
7 return inner
8
9 @outer
10 def func1():
11 print('func1')
12
13
14 func1()

func_before

func1

func_after


 
看结果,在不改变原先调用方式的基础上,实现了在原来函数的前后增加功能的效果。
 
刚才我们说到了,程序自上而下执行,同一个函数,前面的会被后面的“覆盖”。我们要想在原来的功能上增加新功能,又不想改变原来的调用方式,我们就需要重新生成一个同名函数,在这个函数上添加新功能,然后让这个函数“覆盖”原来的函数,就可以实现目的。
 
我们看上面这段代码,
  • 第1行到第7行是一个名叫outer的函数,
  • 第9行@outer的作用就是将@outer下面的函数名(即func1)传给outer函数,进而调用outer()
  • 进而调用outer()的结果是
    1. print("func_before")
    2. 调用func1(),print(func1),返回值None赋值给r(如果原函数有返回值)
    3. print("func_after")
 
 
 
 

Python 装饰器原理剖析的更多相关文章

  1. python装饰器原理

    妙处在于装饰器的两个return 1.装饰器 # 使用闭包 def wrap(fun): def check(): print("正在检查用户权限!") fun() return ...

  2. 【低门槛 手把手】python 装饰器(Decorators)原理说明

    本文目的是由浅入深地介绍python装饰器原理 装饰器(Decorators)是 Python 的一个重要部分 其功能是,在不修改原函数(类)定义代码的情况下,增加新的功能 为了理解和实现装饰器,我们 ...

  3. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  4. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  5. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  8. Python装饰器模式学习总结

    装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...

  9. Python 装饰器(Decorator)

    装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...

随机推荐

  1. MySql(一)表类型(存储引擎)

    MySql(一)表类型(存储引擎) 一.MYSQL存储引擎概述 二.存储引擎的特性对比 2.1 MyISAM 2.2 InnoDB 2.2.1 自动增长列 2.2.2 外键约束 2.2.3 存储方式 ...

  2. GeoMesa命令行,索引概述

    GeoMesa 一.GeoMesa命令行 查看classpath 创建表 描述表 批量导入数据 解释查询 统计分析 导出feature 删除feature 获取目录中的全部表的名称 删除表 删除目录 ...

  3. 函数式编程(__slots__)

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...

  4. 第2层交换和生成树协议(STP)__MAC地址表

    1.MAC(Media Access Control, 介质访问控制)地址是识别LAN节点的标识.网卡的物理地址通常是由网卡生产厂家烧入网卡的EPROM(一种闪存芯片,通常可以通过程序擦写),它存储的 ...

  5. 【实战】通过Python实现疫情地图可视化

    目录 一. json模块 二.通过Python实现疫情地图可视化 2.将json格式的数据保存到Excel 3.应用pyecharts进行数据可视化 一. json模块 JSON(JavaScript ...

  6. python格式转换的记录

    Python的格式转换太难了. 与其说是难,具体来说应该是"每次都会忘记该怎么处理".所以于此记录,总的来说是编码+格式转换的记录. 本文记录环境:python3.6 经常见到的格 ...

  7. Pytest(3)fixture的使用

    fixture的优势 Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进: 命名方式灵活,不局限于 setup 和teardown 这几个命名 conf ...

  8. VScode 连接虚拟机

    VScode 连接虚拟机 在VScode上面使用SSH连接虚拟机,编写代码以及运行都将会方便许多 打开VScode,安装Remote-SSH插件 配置SSH连接信息 点击左侧第四个图标,然后单击设置按 ...

  9. BZOJ1396 识别子串【SAM+SegmentTree】

    BZOJ1396 识别子串 给定一个串\(s\),对于串中的每个位置,输出经过这个位置且只在\(s\)中出现一次的子串的最短长度 朴素的想法是,我们要找到那些只出现一次的子串,之后遍历每个串,把串所覆 ...

  10. Codeforces Round #650 (Div. 3) F1. Flying Sort (Easy Version) (离散化,贪心)

    题意:有一组数,每次操作可以将某个数移到头部或者尾部,问最少操作多少次使得这组数非递减. 题解:先离散化将每个数映射为排序后所对应的位置,然后贪心,求最长连续子序列的长度,那么最少的操作次数一定为\( ...