• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python装饰器decorator用法实例

Python装饰器decorator用法实例

作者:shichen2014 字体:[增加 减小] 来源:互联网

shichen2014 通过本文主要向大家介绍了python decorator,decorator,decorator是什么意思,decorator模式,interior decorator等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了Python装饰器decorator用法。分享给大家供大家参考。具体分析如下:

1. 闭包(closure)

闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数的环境变量。环境变量和这个非全局函数一起构成了闭包。
    y = [1,2,3]
    def inner():
        print x
        print y
    return inner
x = 5    #这个x没有被引用
f = outer(2)
f()</div>
print f.__closure__   #函数属性__closure__存储了函数的环境变量 def entrance(func):
 = 5    #这个x没有被引用f = outer(2)f()print f.__closure__   #函数属性__closure__存储了函数的环境变量 def entrance(func):
x和y都是属于函数outer命名空间的,在inner中被引用,当outer函数退出后,outer的命名空间不存在了,但是inner依然维护了其定义时候对其外部变量x,y的连接。
程序输出:
  2
  [1, 2, 3]
  (, )

装饰器是一个可调用对象(a callable),在Python中,函数是对象,当然也是可调用的,所以装饰器可以是一个函数,我们称其为函数装饰器。
这个可调用对象以一个函数作为参数,闭且返回另一个函数(来替换参数那个函数)。
比如:

     def inner():
         print "inside function :", func.__name__
         func()
     return inner</div>
 
entrance是一个装饰器,它是一个函数,它可以接收一个函数func作为参数,返回了另一个函数inner。
那为什么叫装饰器了,在返回函数inner()的内部,调用了func(),而且还作了额外的操作,相当于“装饰”了函数func。
那如何使用装饰器?

    pass
fun1 = entrance(fun1)
def fun2():
    pass
fun2 = entrance(fun2)</div>
 
fun1,fun2的名字都没有变,但是通过调用函数装饰器entrance(),它们已经指向了另一个函数inner(),“装饰了”自己。

@操作符

Python提供的@符号,实质上就是上面做的,对一个函数名进行从新赋值,是语法上的技巧。所以上面的代码等价于
def fun1():
    pass
@entrance
def fun2():
    pass</div>
 
2. 装饰器的用途

从这个刻意构造的很简单的例子,可以看出装饰器的意义,如果一个函数需要一个功能,如果这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能。
上面的装饰器entrance,装饰一个函数后,函数被调用时会打印出这个函数的名字。
但是有一个问题,这个装饰器从功能上看,是要应该可以用来装饰任何函数,但是如果我们用它来装饰了一个带参数的函数
 def fun3(x):
     pass</div>
只要不调用fun3,这三行代码是不会让Python解释器报错的,因为我们已经知道,它等价于:
    pass
fun3 = entrance(fun3)</div>
 
我们定义了一个带参的函数fun3,然后把fun3指向了另一个函数inner(),当然不会有什么错。
 
但是,当我们使用fun3时,我们肯定会按照它定义时的样子去使用它,给它传入一个参数。
>>>fun3(1)
这里就会出错了,看看解释器怎么报错的

Traceback (most recent call last):
File “decorator.py”, line 23, in www.jb51.net <module>
fun3(1)
TypeError: inner() takes no arguments (1 given)

当然我们已经很容易知到为什么会这样报错了,fun3已经不是指向它定义时那个函数了,它现在指向了”inner()”,而inner是没有参数的,当然会出错。
那怎么解决呢?
修改一下inner()的定义,让它可以就收任意个参数就可以了。

     def inner(*args, **kvargs):
         print "inside function : ", func.__name__
         func(*args, **kvargs)
     return inner</div>
现在,给inner传任意个参数都不会出错了,也就是entrance可以被用来装饰任何一个函数了。

3. 写个装饰器logger

一个函数被调用时,在日志里记录其名称和被调用的实际参数
    def inner(*args, **kvargs):
        print  func.__name__, 'called, arguments: ', args, kvargs
        func(*args, **kvargs)
    return inner</div>

希望本文所述对大家的Python程序设计有所帮助。

</div>

您可能想查找下面的文章:

  • 分析Python中设计模式之Decorator装饰器模式的要点
  • python装饰器decorator介绍
  • python装饰器decorator介绍
  • Python装饰器decorator用法实例
  • python self,cls,decorator的理解

相关文章

  • 几个提升Python运行效率的方法之间的对比
  • python批量同步web服务器代码核心程序
  • python 正则式 概述及常用字符
  • Python的Bottle框架中返回静态文件和JSON对象的方法
  • Python实现扫描指定目录下的子目录及文件的方法
  • python文件与目录操作实例详解
  • Python中使用HTMLParser解析html实例
  • 跟老齐学Python之大话题小函数(2)
  • python+mysql实现简单的web程序
  • Python最基本的输入输出详解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python中sets模块的用法实例
    • python3实现ftp服务功能(服务端 For Linux)
    • Python3基础之list列表实例解析
    • Python的collections模块中namedtuple结构使用示例
    • python使用7z解压软件备份文件脚本分享
    • 举例讲解Python中装饰器的用法
    • Python下singleton模式的实现方法
    • Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
    • 使用python实现生成用户信息
    • Python实现的ini文件操作类分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有