什么是装饰器?
谈装饰器前,还要先要明白一件事,Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如:
def foo():
print("foo")
def bar(func):
func()
bar(foo)
装饰器本质上是一个 Python
\
函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。。
# 装饰器的作用:在不改变源代码的情况下,给现有的函数增加新的功能
# 装饰器通过@进行使用 ,相当于把hello() 函数作为参数,传给startEnd()
# @startEnd 相当于 hello = startEnd(hello)
# 当你调用hello()的时候,是不是就相当于调用了startEnd(hello())()
def startEnd(func):
def aa(name):
print("!!!!!!!!start!!!!!!!!!!")
func(name)
print("!!!!!!!!!end!!!!!!!!!")
return aa
@startEnd
def hello(name):
print("hello {0}".format(name))
hello("huaicong")
用下面这段代码来理解下装饰器
def use_logging(func):
def wrapper():
logging.warn("%s is running" % func.__name__)
return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
return wrapper
def foo():
print('i am foo')
foo = use_logging(foo) # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于 foo = wrapper
foo()
use_logging 就是一个装饰器,它一个普通的函数,它把执行真正业务逻辑的函数 func 包裹在其中,看起来像 foo 被 use_logging 装饰了一样,use_logging 返回的也是一个函数,这个函数的名字叫 wrapper。在这个例子中,函数进入和退出时 ,被称为一个横切面,这种编程方式被称为面向切面的编程。
@ 语法糖
@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。
带参数的装饰器。。
暂时还看不懂
17万+

被折叠的 条评论
为什么被折叠?



