Python 装饰器

 

装饰器对与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函数: 说说Python装饰器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

相关文章
相关标签/搜索