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

什么是装饰器?

我们知道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. Spring Cloud Config、Apollo、Nacos配置中心选型及对比

    Spring Cloud Config.Apollo.Nacos配置中心选型及对比 1.Nacos 1.1 Nacos主要提供以下四大功能 2.Spring Cloud Config 3.Apollo ...

  2. python--基础3(流程语句)

    资源池 链接:https://pan.baidu.com/s/1OGq0GaVcAuYEk4F71v0RWw 提取码:h2sd 本章内容: if判断语句 for循环语句 while循环语句 break ...

  3. 2. Linux常用系统工作命令

    1.echo:在终端输出字符串或变量提取后的值.echo [字符串 | $变量] 举例:[root@Centos~]# echo $SHELL /bin/bash 2.date:显示及设置系统的时间或 ...

  4. P1046 陶陶摘苹果 Python实现

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  5. Java并发包源码学习系列:阻塞队列实现之LinkedBlockingDeque源码解析

    目录 LinkedBlockingDeque概述 类图结构及重要字段 linkFirst linkLast unlinkFirst unlinkLast unlink 总结 参考阅读 系列传送门: J ...

  6. Kafka调试入门(一)

    很多人对kafka消息队列应该不陌生,使用起来也比较方便.对kafka最常见的操作一般有如下几种: 启动kafka集群 创建一个名称为xxx的主题(topic) 查看已经创建好的主题 向xxx这个主题 ...

  7. Java链表(英雄增删查改)

    链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 1.链表是以节点的方式来存储,是链式存储. 2.每个节点包含 data 域, next 域:指向下一个节点. 3 ...

  8. linux(2)系统目录结构

    前言 平常linux系统用的也不少,那么linux下的每个目录都是用来干什么的,小伙伴们有仔细研究过吗?让我们来了解下吧 Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: [root@ ...

  9. Codeforces Round #582 (Div. 3) C. Book Reading

    传送门 题意: 给你n,k.表示在[1,n]这个区间内,在这个区间内找出来所有x满足x%k==0,然后让所有x的个位加到一起(即x%10),输出. 例如:输入10 2 那么满足要求的数是2 4 6 8 ...

  10. Codeforces Round #496 (Div. 3) D. Polycarp and Div 3 (数论)

    题意:给你一个巨长无比的数,你可以将这个数划成任意多个部分,求这些部分中最多有多少个能被\(3\)整除. 题解:首先我们遍历累加每个位置的数字,如果某一位数或者累加和能被\(3\)整除(基础知识,不会 ...