Python - 函数进阶之装饰器

本章内容

  1. 高阶函数
  2. 装饰器

前言

  接着上一篇函数进行整理。。

一、高阶函数

  高阶函数就是将一个函数以参数的形式传入另一个函数

 1 def main_func(func):
 2 # 定义一个主函数,并设置一个参数func
 3
 4     return func
 5     # 返回func的值,因为我需要传入一个函数,即返回func的返回值
 6
 7 def func():
 8 # 定义一个函数作为参数传入主函数
 9
10     return "Lyon"
11     # 返回 "Lyon" 给func()
12
13 res = main_func(func())
14 # res接收main_func的返回值,将func()的返回值作为参数传入main_func函数
15
16 print(res)
17 # 打印结果      : Lyon

二、装饰器

  什么是装饰器?听名字我们就知道是一个进行装饰的工具,装饰什么?当然是装饰函数,即给原来的函数加上一些功能。

  装饰器是由函数去生成的,用于装饰某个函数或者方法或者类(类以后再说),他可以让这个函数在执行之前或者执行之后做一些操作。反正就是给函数加功能。

  语法:

1.  def  decorator(func) :

2.    pass

3.  @decorator             @ + "函数名"  是python中的一种语法糖

4.  def  func() :

5.    pass

  学习装饰器,首先得知道上述  @ + "函数名" 这个语法糖 到底进行了些什么操作。

  就利用上述语法作为例子,来说一下语法糖 进行的操作:

    首先 @ + "函数名" ---> 将该操作下面的函数的函数名(即func)作为参数传入装饰器函数(即decorator),等装饰器函数执行完之后又将装饰器函数返回值返回给函数名

    一个等式:

@decorator   =   decorator(func)    ,   func   =   decorator的返回值

  • 第一个版本
 1 def decorate(func):
 2 # 定义装饰器函数,func参数接收被装饰函数名
 3
 4     return func()
 5     # 返回function的返回值给decorate
 6
 7 @decorate      #给function函数装上decorate函数
 8 def function():
 9 # function最后会接收decorate的返回值
10
11     return "装饰成功!"
12     # function的返回值为 "装饰成功!"
13
14 res = function
15 # 进行调用,不要加括号,加了会报错。----> 传递过程在下面
16
17 print(res)
18 # 打印结果   :"装饰成功!"

  函数的调用其实就是调用函数名,而函数名其实就是一个内存地址,方式是通过 括号"( )"进行调用。

  传递过程:function --> decorate(function) -->  function()  --> decorate --> function

  传递过程注解:函数名 --> decorate中的参数 --> 加括号进行调用 --> 返回decorate --> 返回函数名

  通过传递过程我们可以知道,在过程中function已经进行了调用,所以最后我们进行调用的时候是不能在加括号的,因为function此时已经是运行后拿到了返回值。

  • 第二个版本
 1 def decorate(func):
 2 # 定义装饰器函数,func参数接收被装饰函数名
 3
 4     def inner():
 5     # 这一步的作用通过调用方式基本能看出来了
 6
 7         return func()
 8         # 将function的返回值给inner
 9
10     return inner
11     # 将inner内存地址返回给decorate
12
13 @decorate      #给function函数装上decorate函数
14 def function():
15 # function最后接收的是一个内存地址
16
17     return "装饰成功!"
18     # function的返回值为 "装饰成功!"
19
20 res = function()
21 # 利用 ( ) 调用其函数名,函数名现在对应的是inner的内存地址
22
23 print(res)
24 # 打印结果   :"装饰成功!"

  一般我们用的是第二个版本,因为最后调用方式跟我们进行函数调用的方式是一样的。

  *语法糖:指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。语法糖主要是为程序员提供更实用的编码方式,提高代码的可读性,并有益于更好的编码风格。

  通过以上基本已经了解了装饰用的用法,以及原理。

  更多示例:

 1 def decorator1(func):
 2     def inner():
 3         return func()
 4     return inner
 5
 6 def decorator2(func):
 7     def inner():
 8         return func()
 9     return inner
10
11 @decorator1
12 @decorator2
13 def function():
14     print("执行函数...")
15 function()

多个装饰器装饰同一个函数

 1 def decorator(func):
 2     def inner(name):
 3     #被装饰函数参数所放位置
 4
 5         return func(name)
 6     return inner
 7
 8 @decorator
 9 def function(name):
10     print("my name is %s" % name)
11
12 function("Lyon")

被装饰函数带有参数

  以上基本完成了装饰器的功能。这里的一个中间过程 是将 被装饰函数进行了一次调用,所以被装饰函数中的元信息(如:函数的注释信息)并没有赋值进装饰器函数内部。

  如果需要把元信息也赋值进装饰器,那个可以使用 @functools.wraps

 1 def decorator(func):
 2     @function.wraps(func)
 3     def inner(name):
 4         return func(name)
 5     return inner
 6
 7 @decorator
 8 def function(name):
 9     """
10     这就是一个不起眼的函数
11     :param name:
12     :return:
13     """
14     print("my name is %s" % name)
15 function("Lyon")

functools.wraps

时间: 2024-09-30 06:54:42

Python - 函数进阶之装饰器的相关文章

python开发函数进阶:装饰器

一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 二,设计模式 开放封闭原则 *对扩展是开放的 *对修改是封闭的 三,代码解释 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 tag = False 5 6 def login(func): 7 def inner(*args,**kwargs): 8 global tag 9 if tag == False: 10 user = input('pl

python函数四(装饰器进阶)

一.开放封闭原则 1.对扩展是开放的 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了开放封闭原则. 二.函数的有用信息 def func(): ''' 本函数主要用于绘图,实时接收数据 :return:返回给前端某标签 ''' print(func.__doc

python函数三 (装饰器)

一.函数名(学名:第一类对象) 函数名本质上就是函数的内存地址.通俗点就是特殊的普通变量 def func(): print(111) func() print(func) # 结果: # 111 # <function func at 0x00000150713F6048> 1.可以被引用(即可以赋值给其他变量) def func(): print('in func') f = func f() # 结果: # in func 2.可以被当作容器类型的元素 def func(): print

函数进阶(装饰器)

装饰器 python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针).装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字:内层函数(闭包)负责修饰被修饰函数.从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解: 实质: 是一个函数 参数:是你要装饰的函数名(并非函数调用) 返回:是装饰完的函数名(也非函数调用) 作用:为已经存在的对象添加额外的功能 特点:不需要对对象做任何的代码

Python - 函数属性方法装饰器(二)

1.给类绑定属性值 类名.属性名 = 属性值 class Stu(object): # 构造方法 def __init__(self): print('我是一个学生') # 给类添加属性 s = Stu() s.name = 'Tom' print(s.name) 注:仅供当前对象使用 2.类.对象的属性操作 setattr() 函数用于设置属性值,该属性不一定是存在的. setattr(object, name, value) -object: 对象 -name:对象属性,字符串 -value

Python进阶(六)----装饰器

Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ? 增加一些额外的新功能 封闭原则: ? 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ? 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包 ###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}'

python笔记5:装饰器、内置函数、json

装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1) print('run....') 现有一个新的需求,希望可以记录下函数的运行时间,需要在代码中计算时间的代码: def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() pr

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11