简介

装饰器实质上是一个函数,它把一个函数作为输入并且返回给另一个函数;主要作用于在不改变源代码的情况下,修改已经存在的函数,使函数增加新的功能

装饰器-高阶函数1

函数可以赋值给变量,即:变量可以指向函数

既然变量可以指向函数,函数的参数能接受变量,那么一个函数就能接收另一个“函数名”作为参数,这种函数就称之为高阶函数

def function(func):#接收一个函数名,这个函数名其实就相当函数的地址,通过这个函数名加上一对括号()就可以运行这个函数,如下面第四行print("夜晚即将来临")#装饰器新增的功能func()#===========>相当于z_func()def z_func():#z_func代表的是主函数print("夜空中最亮的星")function(z_func)#相当于向function传递了z_func的地址

装饰器-高阶函数1.2

def function(func):#这个func相当函数的地址,并不具实体意思,如十七行print("夜晚即将来临")#装饰器新增的功能print(func)return func#返回func的地址def z_func():print("夜空中最亮的星")z_func = function(z_func)#左边的z_func是一个新的变量,接收来自function的返回值,其实接收的是旧的z_func函数的地址,新的z_func通过加上()又可以运行旧的z_func函数了
z_func()

装饰器-嵌套函数1

函数的嵌套是指在一个函数内又新定义一个函数,而不是直接调用另一个函数

def foo(hh):print("in the foo")def bar():print("in the bar")print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用bar()#调用foo函数里定义的函数foo("hh")#调用foo

装饰器-嵌套函数1.2

def foo(hh):print("in the foo")def bar():print("in the bar")print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用return bar#返回bar的地址test = foo("hh")#接收子函数bar的地址
test()

装饰器-高阶函数加嵌套函数

def deco(funcTest):#等价于funcTest = funcdef function():print("夜晚即将来临")funcTest()#========>func()return function#相当于加上新功能的funcdef func():print("夜空中最亮的星")func = deco(func)
func()

装饰器-初步

def deco(funcTest):#等价于funcTest = funcdef function():print("夜晚即将来临")funcTest()#========>func()return function#相当于加上新功能的func@deco#相当于func = deco(func)
def func():print("夜空中最亮的星")func()

装饰器-进阶

def deco(funcTest):#等价于funcTest = func,应该是传递地址时,同时也将该函数的信息传递过去了包括它的实参def funcDeco(*args, **kwargs):print("夜晚即将来临")funcTest(*args, **kwargs)#========>func()return funcDeco@deco#相当于func = deco(func)
def func(temp):#带参数print("夜空中最亮的星")print("in the func", temp)func("星星真好看")

装饰器-终极版

def deco(deco_type):print("------->>>>", deco_type)def outer_wrapper(funcTemp):print("--------->>>>", funcTemp)def wrapper(*args, **kwargs):print("----------->>>>", *args, **kwargs)print("夜晚即将来临")print("---------------->>>>'deco_type' = %s 是局部变量里的全局变量,因为它位于顶层的函数内"% deco_type)return funcTemp(*args, **kwargs)#funcTemp()相当于func(),因为func()可能有返回值,所以wrapper()函数也要添加一个返回值, 用于返回func()的返回值return wrapperreturn outer_wrapper@deco(deco_type = "txt")#添加参数
def func(temp):print(temp)return "今晚的夜空真美"print(func("夜空中最亮的星"))

Python_装饰器Decorator相关推荐

  1. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

  2. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  3. [react] 装饰器(Decorator)在React中有什么应用?

    [react] 装饰器(Decorator)在React中有什么应用? connect.withRouter,等类似的高阶组件都可以用装饰器来使用 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放 ...

  4. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  5. 装饰器Decorator(函数的装饰)

    一.LEGB函数作用域的优先级和解析 函数是function的一个对象,被调用完后内部变量就会被回收,被引用的除外(例如return的变量) 1.   local :函数内部作用域 2.  enclo ...

  6. python描述器descriptor_python装饰器decorator、描述器descriptor

    背景 image.png 装饰器decorator 返回值为另一函数的函数,通常使用 @wrapper语法. 装饰器的常见例子包括 装饰器语法只是一种语法快捷方式,以下两个函数定义在语义上完全等价: ...

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

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

  8. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

  9. Python的装饰器decorator

    Python的装饰器decorator 作者:王大为 时间:2016-10-19 一.装饰器的本质 本质:装饰器本身就是一个函数,高阶函数+嵌套函数==>装饰器 原则: * 1.不能修改被装饰函 ...

最新文章

  1. 在线作图|在线做Metastats组间差异分析
  2. 区域人工智能集群效果显著 各大省市怎样布局?
  3. redis超时问题分析
  4. python爬虫教程 百度云-如何使用python编程【python爬虫教程 百度云】
  5. ajax 更新页面变量,[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量
  6. Git 的 4 个阶段的撤销更改
  7. 【渝粤题库】陕西师范大学292241金融市场学Ⅰ 作业(高起专)
  8. 几个常用SQL2000语句
  9. C# 线程手册 第二章 .NET 中的线程 线程的优势
  10. 拿 1% 月收入买比特币,比养老金更靠谱! —— CSDN 蒋涛答王峰十问
  11. 收藏精美网页设计作品的200佳网站推荐(系列五)
  12. 现实给了梦想多少时间?
  13. Linux下安装redis5.0.7
  14. VBA技能:取整函数的使用
  15. L0到L4超全介绍!30+自动驾驶方案汇总
  16. 微信公众平台如何审核
  17. 会玩,也是一种积极的生活态度
  18. 当你觉得焦虑,烦躁的时候怎么办?
  19. 蓝牙耳机型号有哪些?口碑最好的蓝牙耳机
  20. Android Q SQLite性能问题调研

热门文章

  1. jquery 动态加载html,jQuery – 动态创建iframe并加载页面
  2. matlab 迭代时保存每次迭代数据,Matlab 迭代步数据保存问题.
  3. c语言if判断文件_例8:C语言实现输入一个数,输出相应result
  4. Jmeter 新手教程
  5. Layer弹出层关闭后刷新父页面
  6. 「雕爷学编程」Arduino动手做(18)---太阳能电池模块
  7. BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)
  8. 实现多线程爬取数据并保存到mongodb
  9. 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...
  10. 高程 第7章函数表达式 7.1递归 7.2闭包