上次妮子问我装饰器的问题,当时学的很菜,现在也很菜, 只是硬生生的把自己的记忆和例子结合取来来帮她解答。
这次又重新学习了一遍:
- 装饰器在函数前后执行相关的功能:
装饰器和函数都不包含参数 , 要想返回内部函数的返回至 , 需要将 内部函数的返回值保存到一个变量里面,然后返回这个值。
def deco(func):
print(“before”)
ret = func()
print(“end”)
return retdef myfunc():
print(“hello”)
return “hello”z = deco(myfunc)
before
hello
end
z
‘hello‘ - 使用 @ 来修饰
函数同上一个例子一样, 只不过函数定义 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, 可以看到返回值, 不过装饰器的作用就没有了, 这不是我们想要的啊 - 使用闭包(内嵌函数)来保证函数每次执行时,装饰器的作用都能保障
重写装饰器函数
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, 这次能装饰器函数的参数是我们 要作用的函数, 内部闭包没有参数
- 装饰器装饰 拥有参数的函数,
装饰器 的参数为我们的函数 ,而里面闭包的参数为 函数的参数 # 数学表达式 是这个样子滴 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)
- 装饰器自己拥有参数, 函数没有参数
装饰器的参数为 自己的参数 , 第一个闭包函数的参数为 我们的函数。
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"
- 函数的参数不确定, 装饰器的参数也不确定
参数用(args, *kwargs),自动适应变参和命名参数‘‘‘
参考资料: http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
时间: 2024-10-25 17:24:19