装饰器对与Python新手以致于熟悉Python的人都是一个难理解, 难写的东西. 那么今天就分享一下我对Python 装饰器的理解linux
所谓装饰器仅仅是一种语法糖, 可做用的对象能够是函数也能够是类, 装饰器自己是一个函数, 其主要工做方式就是将被装饰的类或者函数看成参数传递给装饰器函数, 好比定义以下装饰器shell
import timedef run_time(func): def wrapper(*args, **kwargs): start = time.time() r = func(*args, **kwargs) print time.time() - start return r return wrapper
咱们用这个装饰器装饰一个test
函数app
@run_timedef test(): print "just a test"
前面说过其实装饰器就是一个语法糖, 就是将被装饰的函数做为参数传递给装饰器函数, 因此上面能够展开为ide
test = run_time(test)
装饰器将在解释器运行一开始就被加载, 从而将被装饰的函数将被展开成如上方式, 由于 run_time
装饰器返回wrapper
函数, 因此当调用test
函数时其实就是对wrapper
的调用函数
若是你在Python shell下执行以上语句就会发现定义完test
函数而后查看test
时, shell所展现的是wrapper函数: url
接下来讲说如何编写带参数的装饰器, 你们若是细心的话就能够发现其实带参数的装饰器是通过调用"装饰器"函数返回的一个装饰器, 之因此装饰器上打引号是说明其实这个所谓的"装饰器"只不过是一个普通的函数, 但这个普通的函数返回一个装饰器, 能够参看下面例子:spa
import timedef route(url): def decorator(func): func.__url__ = url return func return decorator@route(r"/")def index(): return "Hi"
你们能够发如今使用route
装饰器时咱们实际上是调用了route
函数, route
函数返回一个decorator
装饰器, 由于咱们不须要在装饰器内运行函数, 因此不须要一个wrapper
函数来收集参数.code
以上就是所有内容, 但愿对装饰器只知其一;不知其二的人有些许帮助orm