`

python装饰器

阅读更多

了解装饰器,要先了解闭包。

 

1,闭包(closure)

闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数的环境变量。环境变量和这个非全局函数一起构成了闭包。

复制代码
 1 def outer(x):
 2     y = [1,2,3]
 3     def inner():
 4         print x
 5         print y
 6     return inner
 7 
 8 x = 5    #这个x没有被引用
 9 f = outer(2)
10 f()
11 print f.__closure__   #函数属性__closure__存储了函数的环境变量
复制代码

x和y都是属于函数outer命名空间的,在inner中被引用,当outer函数退出后,outer的命名空间不存在了,但是inner依然维护了其定义时候对其外部变量x,y的连接。

程序输出:

  2
  [1, 2, 3]
  (<cell at 0x7f672a5b98d8: int object at 0x23a3c50>, <cell at 0x7f672a5b9910: list object at 0x7f672a5a03f8>)

 

 

2,装饰器(Decorator)

装饰器是一个可调用对象(a callable),在Python中,函数是对象,当然也是可调用的,所以装饰器可以是一个函数,我们称其为函数装饰器。

这个可调用对象以一个函数作为参数,并且返回另一个函数(来替换参数那个函数)。

比如:

1 def entrance(func):
2     def inner():
3         print "inside function :", func.__name__
4         func()
5     return inner

entrance是一个装饰器,它是一个函数,它可以接收一个函数func作为参数,返回了另一个函数inner。

 

那为什么叫装饰器了,在返回函数inner()的内部,调用了func(),而且还作了额外的操作,相当于“装饰”了函数func。

 

那如何使用装饰器?

复制代码
1 def fun1():
2     pass
3 fun1 = entrance(fun1)
4 
5 def fun2():
6     pass
7 fun2 = entrance(fun2)
复制代码

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

 

@操作符

Python提供的@符号,实质上就是上面做的,对一个函数名进行从新赋值,是语法上的技巧。所以上面的代码等价于

复制代码
1 @entrance
2 def fun1():
3     pass
4 
5 @entrance
6 def fun2():
7     pass
复制代码

 

装饰器的用途?

从这个刻意构造的很简单的例子,可以看出装饰器的意义,如果一个函数需要一个功能,如果这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能。

上面的装饰器entrance,装饰一个函数后,函数被调用时会打印出这个函数的名字。

 

但是有一个问题,这个装饰器从功能上看,是要应该可以用来装饰任何函数,但是如果我们用它来装饰了一个带参数的函数

1 @entrance
2 def fun3(x):
3     pass

只要不调用fun3,这三行代码是不会让Python解释器报错的,因为我们已经知道,它等价于:

def fun3(x):
    pass
fun3 = entrance(fun3)

我们定义了一个带参的函数fun3,然后把fun3指向了另一个函数inner(),当然不会有什么错。

 

但是,当我们使用fun3时,我们肯定会按照它定义时的样子去使用它,给它传入一个参数。

>>>fun3(1)

这里就会出错了,看看解释器怎么报错的

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

当然我们已经很容易知到为什么会这样报错了,fun3已经不是指向它定义时那个函数了,它现在指向了"inner()",而inner是没有参数的,当然会出错。

 

那怎么解决呢?

 

修改一下inner()的定义,让它可以就收任意个参数就可以了   【注:参见Python函数一文】

1 def entrance(func):
2     def inner(*args, **kvargs):
3         print "inside function : ", func.__name__
4         func(*args, **kvargs)
5     return inner

现在,给inner传任意个参数都不会出错了,也就是entrance可以被用来装饰任何一个函数了。

 

 3,写个装饰器logger

一个函数被调用时,在日志里记录其名称和被调用的实际参数

复制代码
1 def logger(func):
2     def inner(*args, **kvargs):
3         print  func.__name__, 'called, arguments: ', args, kvargs
4         func(*args, **kvargs)
5     return inner
6         
复制代码

 

 python中实现静态方法和类方法都是依赖于python的修饰器来实现的。

class MyClass: 

    def  method(self): 

           print("method") 

    @staticmethod 

    def  staticMethod()

            print("static method") 

     @classmethod 

     def classMethod(cls)

           print("class method") 

 

大家注意到普通的对象方法、类方法和静态方法的去别了吗?

对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的。

分享到:
评论

相关推荐

    Python装饰器模式学习demo

    Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...

    Python装饰器课程的PPT课件和源代码

    !!!CSDN的一个特性: 即使我...关于Python装饰器课程的课件代码相关文件, 文字版讲义见: https://blog.csdn.net/ncepu_Chen/article/details/106075394 视频版本讲义见: https://www.bilibili.com/video/BV1SZ4y1s7cv/

    Python 装饰器实现DRY(不重复代码)原则

    Python装饰器是一种强大的编程工具,它能够帮助我们遵循DRY(Don't Repeat Yourself,不重复代码)原则,通过减少重复代码提高代码的可维护性和可读性。DRY原则是软件开发中的重要原则之一,它建议每一个程序逻辑都...

    python装饰器详解,python装饰器笔记心得.doc

    "Python装饰器详解" Python装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼。这也是Python面试中必问的问题。但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,...

    python装饰器写的斗地主

    在这个“python装饰器写的斗地主”项目中,我们将深入探讨如何利用装饰器来实现斗地主游戏中的核心算法——洗牌和抓牌。 首先,斗地主游戏的基础是有一副完整的扑克牌,通常包含54张牌(52张常规牌加上两张鬼牌)。...

    通俗讲解python 装饰器

    总结来说,Python装饰器是实现代码复用和功能扩展的强大工具,它们允许我们在不修改原有函数代码的情况下,增加或修改函数的行为。通过熟练掌握装饰器,开发者能更好地组织和优化代码,提升代码质量和可维护性。

    详解Python装饰器由浅入深

    【Python装饰器详解】 装饰器在编程中是一种强大的工具,尤其在Python中,它使得代码更加灵活和可扩展。装饰器本质上是一个接收函数并返回新函数的函数,它允许我们修改或增强函数的行为,而无需修改函数本身的源...

    浅谈python装饰器探究与参数的领取

    Python装饰器是Python编程语言中的一个重要特性,它们允许我们在不修改原有函数代码的情况下,增加或扩展函数的功能。在本文中,我们将深入探讨Python装饰器的工作原理及其与参数的关系。 首先,装饰器本质上是一个...

    Python装饰器使用你可能不知道的几种姿势

    Python装饰器是函数编程中的一个重要概念,它允许在不修改原函数代码的情况下,增加函数的功能。装饰器本质上是一个接受函数作为参数并返回一个新函数的函数,通常用于在函数执行前后添加一些额外的操作。在Python中...

    带你了解python装饰器

    ### Python装饰器详解 #### 一、装饰器概念与作用 在Python中,装饰器是一种特殊类型的函数,它可以接收一个函数作为输入,并返回一个新的函数。装饰器的主要目的是增强或修改函数的功能,而无需更改原函数的代码...

    8 Python 装饰器1

    Python装饰器详解 Python装饰器是Python中一种非常强大且灵活的工具,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于有切面需求的场景,比如:插入日志...

    Python装饰器.docx

    Python装饰器

    python 装饰器(示例)

    Python装饰器是编程语言中的一个强大工具,它允许我们在不修改源代码的情况下,扩展或修改函数、类甚至模块的行为。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,...

    Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰器-失败用例自动重试Python装饰

    Python装饰器-失败用例自动重试

    Python36_01----python装饰器.pdf

    Python装饰器是 Python 中一个非常重要的概念,它可以在不修改已有函数的源代码和调用方式的情况下,给已有函数增加额外的功能。在本节中,我们将详细解释 Python 装饰器的概念、组成、语法糖、带参数的装饰器和通用...

    python类装饰器装饰方法通用编码模型分析.pdf

    python装饰器是一个用于封装函数、方法或类的代码的工具,用来显式指定管理它们的代码。一次编写,可用于多种不同的情况。在python 的流行框架中,装饰器应用越来越广泛。用类设计装饰器,可以利用实例属性保持装饰...

    10_python装饰器.pdf

    标题《10_python装饰器.pdf》说明本文档是一份关于Python装饰器的电子课件。装饰器是Python中用于增强函数或类功能的一种设计模式,通常用于代码复用、修改或者插入新的功能。装饰器是Python中的高级特性,使用它们...

    python装饰器简介—这一篇也许就够了(推荐)

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼。 装饰器引入 初期及问题诞生 假如现在在一个公司,有A B C三个业务部门,还有S一个基础服务部门,目前呢,S部门...

    01 python装饰器.docx

    Python装饰器是编程语言Python中的一个高级特性,它允许我们修改或增强已存在函数的功能,而无需更改函数的源代码。装饰器本质上是函数嵌套和高阶函数的结合,即一个函数接收另一个函数作为参数,并返回一个新的函数...

    接口测试使用Python装饰器.doc

    总的来说,Python装饰器在接口测试中的应用提供了一种优雅、灵活的解决方案,使得测试代码更加模块化、可维护,同时增强了测试的效能。通过理解和熟练运用装饰器,我们可以更好地管理和优化接口测试项目。

Global site tag (gtag.js) - Google Analytics