python装饰器

来源:互联网 发布:陌陌直播软件 编辑:程序博客网 时间:2024/06/05 20:50

pycthon装饰器


无参数的装饰器

#coding=utf-8def log(func):    def wrapper():        print 'before calling ',func.__name__        func()        print 'end calling ',func.__name__    return wrapper@logdef hello():    print 'hello'@logdef hello2(name):    print 'hello',nameif __name__=='__main__':    hello()

带参数的装饰器:

#coding=utf-8def log(func):    def wrapper(name):        print 'before calling ',func.__name__        func(name)        print 'end calling ',func.__name__    return wrapper@logdef hello(name):    print 'hello',name@logdef hello2(name):    print 'hello',nameif __name__=='__main__':    hello('haha')

多个参数的时候:

#coding=utf-8def log(func):    '''    *无名字的参数    **有名字的参数    :param func:    :return:    '''    def wrapper(*args,**kvargs):        print 'before calling ',func.__name__        print 'args',args,'kvargs',kvargs        func(*args,**kvargs)        print 'end calling ',func.__name__    return wrapper@logdef hello(name,age):    print 'hello',name,age@logdef hello2(name):    print 'hello',nameif __name__=='__main__':    hello('haha',2)    hello(name='hehe',age=3)

输出:

end calling  hello
before calling  hello
args () kvargs {'age': 3, 'name': 'hehe'}
hello hehe 3
end calling  hello


装饰器里带参数的情况

本质就是嵌套函数

#coding=utf-8def log(level,*args,**kvargs):    def inner(func):        def wrapper(*args,**kvargs):            print level,'before calling ',func.__name__            print level,'args',args,'kvargs',kvargs            func(*args,**kvargs)            print level,'end calling ',func.__name__        return wrapper    return inner@log(level='INFO')def hello(name,age):    print 'hello',name,age@logdef hello2(name):    print 'hello',nameif __name__=='__main__':    hello('haha',2)









原创粉丝点击