不带参数的装饰器
python装饰器也是python解释器下的一颗语法糖。形式上如下:
def mywraper(fun):
def inner():
do somethting
fun()
return inner
@mywraper
def myfun():
dosomething
接着解释器出马了,执行myfun()的时候,会加上解释器的部分,把myfun变成 mywraper(fun)。
带参数的装饰器
def mywraper(paras):
def inner(func):
def inside():
do somethting
fun()
return inside
return inner
@mywraper(paras)
def myfun():
dosomething
不带参数的和带参数的都使用了高阶函数的概念,所不同的是,带参数的比不带参数的多了一层函数作为返回值。
类装饰器
class A:
# Decorator as an instance method
def decorator1(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Decorator 1')
return func(*args, **kwargs)
return wrapper
@classmethod
def decorator2(cls, func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Decorator 2')
return func(*args, **kwargs)
return wrapper
用法上
a = A()
@a.decorator
def myfun():
@A.decorator2
def myfun()
装饰器放在类中最典型的例子是Property,Porperty是个函数装饰器,python解释器将这个被property装饰的函数名字变成一个propery成员,接着可以用@name.setter @name.getter这两个类装饰器。
装饰器的作用很强大,但是要清楚这是语法糖,不要被语法糖所迷惑。
网友评论