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

什么是装饰器?

我们知道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. Java——变量类型

    Java变量类型: 在Java中,所有的变量在使用前必须声明.格式: type identifier [ = value ][, identifier [ =value]-.]; type为Java数 ...

  2. 深入理解java虚拟机,GC参考手册

    深入理解java虚拟机 一.<深入理解Java虚拟机> 1.第2章 Java内存区域与内存溢出异常 2.第3章 垃圾收集器与内存分配策略 3.第4章 虚拟机性能监控与故障处理工具 4.第5 ...

  3. Chrome标签整理

    程序人生 设计素材类网站 关于生活 求职相关网站 Web前端 科技新闻相关网站 优秀资源内含丰富学习资料 项目实例视频资料等 面试简历相关 适合初学者自学的编程网站 国内优秀博客 由于平时经常浏览一些 ...

  4. js打开新窗口并且居中显示

    function openwindow(url,name,iWidth,iHeight) { var url; //转向网页的地址; var name; //网页名称,可为空; var iWidth; ...

  5. Java中的fail-fast和 fail-safe 的区别

    在我们详细讨论这两种机制的区别之前,首先得先了解并发修改. 1.什么是同步修改? 当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改).这就是 ...

  6. 【Java】构造方法

    成员变量声明时初始化和构造方法中初始化的区别 声明时为成员变量赋值,那每次创建这个类的对象都是同一个值. 构造方法初始化,每次创建对象时可以为每一个对象赋不同的值(此时要通过有参构造). 无返回值类型 ...

  7. 2018-2019 ACM-ICPC Brazil Subregional Programming Contest PART (10/13)

    $$2018-2019 ACM-ICPC Brazil Subregional Programming Contest$$ \(A.Slackline\ Adventure\) \(B.Marbles ...

  8. P2765 魔术球问题 (网络流)

    题意:n根柱子 把编号1,2,3....的球依次插到柱子上去 需要满足相邻的两个球编号加起来为完全平方数 n < 55 题解:网络流24(23)题里的 但是一直不知道怎么建图  或者说建图的意义 ...

  9. Codeforces Round #637 (Div. 2)

    比赛链接:https://codeforces.com/contest/1341 A - Nastya and Rice 题意 有 n 堆米,每堆质量在 [a-b,a+b] 之间,这些米的总质量是否可 ...

  10. ZOJ3640-Help Me Escape 概率dp

    题意: 在一个迷宫中有n条路经,你会被随机传送到一条路径,每条路径有一个挑战难度ci,你最初有一个战斗力f,如果你的战斗力大于ci,那么呆在那里ti天就可以成功逃出迷宫.如果你的战斗力小于等于ci,那 ...