简单上手Python中装饰器的使用

 更新时间:2015年07月12日 12:16:53   作者:Yi_Zhi_Yu  
这篇文章主要介绍了Python中装饰器的使用,是Python进阶学习中的重要知识,需要的朋友可以参考下

Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没有任何的改变。

这个看起来很复杂, 实际上应用到了我之前说过的闭包的概念, 仔细看一看, 其实并不复杂。

首先, 我们先定义一个函数, 这个函数可以输出我的个人昵称:

def my_name():
  print "Yi_Zhi_Yu"
my_name() # Yi_Zhi_Yu

那假如我需要在个人昵称输出前, 在输出我的个人uid呢, 当然, 要求是不改动现有的my_name函数, 这个时候就可以使用装饰器了

首先, 装饰器也是个函数, 其次, 他需要接受一个参数,该参数表示了要被装饰的函数(即my_name):

def my_info(func):
  def wrapper(*args, **params):
    print 218
    return func(*args, **params)
  return wrapper

然后与相应的被装饰函数关联起来的方法就是使用@my_info写在被装饰函数的前面

@my_info
def my_name():
  print "Yi_Zhi_Yu"

最后, 在执行my_name的时候, 就能既输出我的uid, 又能输出我的昵称了

my_name()
#218
#Yi_Zhi_Yu

在上面, 最让我们疑惑的是装饰器函数定义里面的wrapper函数, 装饰器本身返回的是wrapper函数的定义, 而wrapper中则定义了对被装饰函数(my_name)的调用, func表示的就是被装饰函数, 说白了, 装饰器只是把某个不得改动的函数(a)放到另一个函数(b)中, 在b里面调用a, 在调用前后就可以做所谓的看起来像装饰的工作了。
my_info的最终返回的wrapper函数的定义, 并不是执行结果,只有当wrapper真正执行的时候, 才会真正的执行my_name方法, 这就是闭包时所说的内容。
wrapper中的参数, 实际上则是传递给func(实际上是my_name)的参数

因为装饰器也是个函数, 那么装饰器自己的能不能有参数传递呢。可以, 不过需要定义一个更高阶的函数, 也就是外面还要套一层函数, 比如, 我还要输出我的自定义的一个信息,需要传递参数

def c_info(text):
  def my_info(func):
    def wrapper(*args, **params):
      print text
      print 218
      return func(*args, **params)
    return wrapper
  return my_info

 #使用装饰器
 @c_info("Tony")
 def my_name():
  print "Yi_Zhi_Yu"

 my_name()
 #Tony
 #218
 #Yi_Zhi_Yu

与前面的那个装饰器相比, 仅仅是多了个外层, 内层也仅仅是增加了对外层传入参数(text)的调用

总而言之, Python在函数定义中支持了对oop思想中的装饰器的实现, 其本质也只是使用了闭包的思路, 延迟调用, 并在调用前后增加自己的其他实现内容

相关文章

  • OpenCV搞定腾讯滑块验证码的实现代码

    OpenCV搞定腾讯滑块验证码的实现代码

    这篇文章主要介绍了OpenCV搞定腾讯滑块验证码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 关于python DataFrame的合并方法总结

    关于python DataFrame的合并方法总结

    这篇文章主要介绍了关于python DataFrame的合并方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 使用python分析统计自己微信朋友的信息

    使用python分析统计自己微信朋友的信息

    这篇文章主要介绍了python分析统计自己微信朋友的信息,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • python中while循环语句用法简单实例

    python中while循环语句用法简单实例

    这篇文章主要介绍了python中while循环语句用法,以一个简单实例形式分析了Python使用while循环语句使用方法,需要的朋友可以参考下
    2015-05-05
  • 使用Python判断一个文件是否被占用的方法教程

    使用Python判断一个文件是否被占用的方法教程

    这篇文章主要给大家介绍了关于如何使用Python判断一个文件是否被占用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python使用句柄控制windows窗口的两种方法

    python使用句柄控制windows窗口的两种方法

    本文主要介绍了python使用句柄控制windows窗口的两种方法,实现窗口的最小化,还原,最大化,关闭操作,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 使用Python实现博客上进行自动翻页

    使用Python实现博客上进行自动翻页

    这篇文章主要介绍了使用Python实现博客上进行自动翻页,需要的朋友可以参考下
    2017-08-08
  • Django模型中字段属性choice使用说明

    Django模型中字段属性choice使用说明

    这篇文章主要介绍了Django模型中字段属性choice使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python人工智能实战之对话机器人的实现

    Python人工智能实战之对话机器人的实现

    本文将通过Python开发一个可以讲笑话的机器人,可以自由定制功能,想讲几个笑话就讲几个笑话。文中的示例代码讲解详细,感兴趣的可以动手试一试
    2022-02-02
  • 解决安装pytorch因网速问题失败的情况

    解决安装pytorch因网速问题失败的情况

    这篇文章主要介绍了解决安装pytorch因网速问题失败的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论