2018-1-29

1.首先我们要知道什么是函数?
函数是将一段代码逻辑,通过特殊的语法组织起来,它可以有参数和返回值,也可以在别的地方被调用!

def res(int x,int y):sum=x+y;return sum;print(res(2,3)); 

def是关键字,res是函数名,x与y是参数,
sum=x+y是函数体,return sum是返回语句。

函数可以有参数,也可以没有,可以有返回值,也可以没有,
python中返回值默认返回None。

2.什么是装饰器?
先写一个简单的装饰器,看不懂没事的

def log(func):def wrapper(*args,**kwargs): #动态参数print("begin call %s"%func.__name__)temp=func(*args,**kwargs) #动态参数print("after call %s"%func.__name__)return temp
return wrapper

装饰器本质上就是一个函数,
用来装饰别的函数,给其他函数附加新的功能。

原则:
(1)不能修改被装饰的函数的源代码
(2)不能修改被装饰函数的调用方式

应用场景:插入日志,性能测试,处理事务。

有一个功能,测试一个函数的运行时间

import time
def f():print("i am f")time.sleep(2)def new_f():s_time=time.time() #开始时间f()e_time=time.time() #结束时间print("耗时:%s"%(e_time-s_time))new_f() #调用该函数

为什么我们需要装饰器呢?

如果我们一个项目中的每个函数都需要计算运行时间呢?难道我们要将计算时间的代码复制到每一个函数中去?而且我们的调用方式可能也发生了变化!因为f()变了,那么我们的new_f()也可能也变了!这未免也太重复了。。。

我们还需要理解下面的概念:
(1)函数即变量

def f():print("i am f")time.sleep(2)n=f
n() #就可以执行这个函数

函数就是一个变量,那么它就可以作为参数,也可以作为返回值。

(2)高阶函数
以函数作为参数,或者以函数作为返回值的函数

(3)函数嵌套
函数里面定义函数

高阶函数 + 嵌套函数 <- 装饰器

我们来写一个装饰器来实现之前的那一个功能

def my_time(func):s_time=time.time()func()e_time=time.time()print("%s耗时%s"%(func.__name__,(e_time-s_time)))

貌似区别不是很大。。。

def my_time(func):def wrapper():s_time=time.time()func()e_time=time.time()print("%s耗时%s"%(func.__name__,(e_time-s_time)))return wrappern=my_time() #n => wrapper
f=n
n=my_time() #n => wrapper
f=n可以转换为:@my_time #这就是一个装饰器
def f():print("i am f")time.sleep(2)

如果一个函数需要加两个功能?
那么我们就多重装饰器,但是我们对顺序做出了要求。
相当于一层一层的,从里到外依次装饰,从外到里依次运行。

(1)加上返回值:

@my_time
def f():return "i am f"

此时我们用装饰器就会出错,因为装饰器里面没有返回值,所以我们需要将装饰器带上返回值

def my_time(func):def wrapper():temp=func()return temp
return wrapper

(2)加上参数:

@my_time
def f(int x,int y):return x+y

此时我们用装饰器就会出错,因为装饰器里面没有参数,所以我们需要将装饰器带上参数

def my_time(func):def wrapper(a,b):temp=func(a,b)return temp
return wrapper

如果说我们的参数个数不一定的话,那么我们就需要使用动态参数了。

但是我们还需要更加高级的装饰器。。。

我们需要装饰器内print的是变量

def log(text):def decortator(func):def wrapper(*args,**kwargs):print(text)temp=func(*args,**kwargs)return tempreturn wrapper
return decortator@log('xueyi')
def f(x,y):return x+y

好神奇啊!

python里的装饰器相关推荐

  1. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  2. 对python里的装饰器

    内裤可以用来遮羞,但是到了冬天它没法为我们防风御寒,聪明的人们发明了长裤,有了长裤后宝宝再也不冷了,装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效. 再回到我们的主 ...

  3. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

  4. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x):return ...

  5. 二十一、深入Python强大的装饰器

    @Author: Runsen 文章目录 闭包 装饰器 嵌套函数的装饰器 带参数嵌套函数的装饰器 类装饰器 嵌套装饰器 @Date:2019年07月11日 最近有同学在问关于Python中装饰器的问题 ...

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

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

  7. 一文搞懂Python知识难点------装饰器

    1.装饰器的本质 装饰器本质上是一个闭包函数,可以让其它函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数. 闭包函数 1)必须是嵌套函数,即外函数中定义了一个内函数: 2)内函 ...

  8. python decorator. decorator_Python 装饰器Decorator(一)

    (一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...

  9. python装饰器 property_介绍Python的@property装饰器的用法

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

最新文章

  1. qt 历史记录控件_[QT] 记录一些使用技巧
  2. angular 自定义组件_如何创建Angular 6自定义元素和Web组件
  3. 【VS开发】【miscellaneous】 Windows下配置Git
  4. devc跟vc2010通用吗_王者荣耀:通用铭文大全!让你赢在起跑线上!教你1比1换铭文...
  5. 学校家教服务管理系统
  6. 联想M7650DF加粉和重置/清零的正确方法
  7. 格雷码与二进制之间转换及VHDL实现
  8. 台式机电源选购资料调研+为什么50%的时候负载功率最大+80PLUS的解释
  9. java利用poi导出excel功能-附带图片导出
  10. DC Administration Services 宣布ISDA裁决委员会2020年申请流程
  11. java mocked_java – 使用PowerMock的Mocked私有方法,但是底层方法仍然被调用
  12. 【Linux】制作U-Boot烧写镜像到SD卡的过程(上篇)
  13. 英雄联盟(LOL)3d模型显示
  14. patronictl
  15. [团队管理]从《亮剑》看团队建设之二——PM如何与组员合作
  16. 【unity学习笔记】OnMouseEnter、OnMouseOver、OnMouseExit
  17. Linux - 操作系统
  18. MongoDB数据库—基本操作
  19. CSS的三种使用方法。 行内样式: 内嵌式: 外部式:
  20. Linux查看BIOS信息:dmidecode命令以及SMBIOS、DMI等

热门文章

  1. SQLite | Where 子句
  2. Nature | IL-27直接靶向脂肪细胞以促进产热而改善肥胖
  3. 机器学习算法 随机森林学习 之决策树
  4. 液滴型单细胞测序技术比较(二)
  5. 用了这么多年的PCA可视化竟然是错的!!!
  6. macOS Big Sur11.2发布候选版更新:修复蓝牙和显示连接问题
  7. 1.5编程基础之循环控制_16买房子
  8. nginx location 斜杠_【一点资讯】斜杠青年双·11买什么本最划算?光影精灵6让你做“多面娇娃” www.yidianzixun.com...
  9. python字符数组输出_python字符串格式化输出
  10. 【ES6(2015)】RegExp