首页 > 代码库 > Python 装饰器学习, (基础知识)

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

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