Python 装饰器学习, (基础知识)

上次妮子问我装饰器的问题,当时学的很菜,现在也很菜, 只是硬生生的把自己的记忆和例子结合取来来帮她解答。

这次又重新学习了一遍:

  1. 装饰器在函数前后执行相关的功能:
    装饰器和函数都不包含参数 , 要想返回内部函数的返回至 , 需要将 内部函数的返回值保存到一个变量里面,然后返回这个值。
    def deco(func):
    print(“before”)
    ret = func()
    print(“end”)
    return ret

    def myfunc():
    print(“hello”)
    return “hello”

    z = deco(myfunc)
    before
    hello
    end
    z
    ‘hello‘

  2. 使用 @ 来修饰
    函数同上一个例子一样, 只不过函数定义 myfunc 的时候 为
    @deco
    def myfunc():
    print("hello")
    return "hello"

    你会注意到函数定义的时候, deco 装饰器就执行了, 再次调用 myfunc(),

    >>> myfunc()

    Traceback (most recent call last):
    File “ “, line 1, in
    TypeError: ‘str‘ object is not callable
    不能执行了, 可以这样调用 myfunc, 可以看到返回值, 不过装饰器的作用就没有了, 这不是我们想要的啊

  3. 使用闭包(内嵌函数)来保证函数每次执行时,装饰器的作用都能保障
    重写装饰器函数
    def deco(func):
    def _deco():
    print("before")
    ret = func()
    print("end")
    return ret

    return _deco

@deco
def myfunc():

print("hello")
return "hello"

z = myfunc()
这次, 定义函数的时候,函数并没有执行, 使用 z= myfunc() 的时候,函数执行,并将返回值返回给了 z, 这次能装饰器函数的参数是我们 要作用的函数, 内部闭包没有参数

  1. 装饰器装饰 拥有参数的函数,
    装饰器 的参数为我们的函数 ,而里面闭包的参数为 函数的参数 # 数学表达式 是这个样子滴 f = deco(func)(*kwargs) ,

    def deco(func):

    def _deco(a,b):
        print("before")
        ret = func(a,b)
        print("end")
        return ret
    return _deco

    @deco():
    def add(a,b)

    print("add called")
    return a+b

add(1,2)

  1. 装饰器自己拥有参数, 函数没有参数
    装饰器的参数为 自己的参数 , 第一个闭包函数的参数为 我们的函数。
    def deco(arg):
    def _deco(func):

    def __deco():
        print("before")
        print("deco args   is %s" %(arg))
        ret  = func()
        print("end")
        return ret
      return __deco

    return _deco

@deco(“lambda”)
def myfunc():

print("hello")
return "hello"
  1. 函数的参数不确定, 装饰器的参数也不确定

参数用(args, *kwargs),自动适应变参和命名参数‘‘‘

参考资料: http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

时间: 2024-10-25 17:24:19

Python 装饰器学习, (基础知识)的相关文章

[转载]Python装饰器学习(九步入门)

本文转载于: http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 # -*- coding:gbk -*- ''

Python装饰器学习

Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc():     print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 ? 1 2 3 4 5 6

Python 装饰器学习心得

最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数,这个特殊的功能就是:装饰另一个函数.举一个最简单的例子来说: 1 def identify(f): 2 print 'Decorator identify called.' 3 return f 这里identify其实是一个装饰器,这个装饰器对输入的参数f不进行任何修饰,然后返回这个参数.其中的

python 装饰器学习(decorator)

最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initial decorator" f() def __call__(self): print "call decorator" @decorator def fun(): print "in the fun" print "after " fun

python装饰器学习笔记

什么是python装饰器? 装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. eg:当需要在Func1和Func2中加一样的功能时,可以在outer中添加一次就可以完成全部函数的添加.装饰器与函数建立连接的方式是在函数的前一行用@+装饰器名称来完成.并且在装饰器中一定要返回被装饰的对象 def outer(fun):     def wrapper():         print '验证'         

Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc():     print("myfunc() called.") myfunc() myfunc() 第二步:使用装饰函数在函数执行前和执行后分别附加额外功能 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

python 装饰器学习

转自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: 最简单的函数,准备附加额外功能 示例1:最简单的函数,表示调用了两次>>> def myfunc(): ... print("myfunc() called.") ... >>> myfunc() myfunc() called. >>> myfunc() myfunc() called. 第二步

Python——装饰器基础

装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. ================================================================================= 什么是装饰器 装饰是为函数和类指定管理代码的一种方式.Python装饰器以两种形式呈现: [1]函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这