jQuery火箭图标返回顶部代码

复习:装饰器

装饰器

装饰器就是闭包函数的一种应用场景

为什么要用装饰器

开放封闭原则:对修改封闭,对扩展开放

什么是装饰器

装饰器-他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调-装饰器的原则:1、不修改被装饰对象的源代码   2、不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新的功能

装饰器的使用

无参装饰器

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print('from foo')
foo()

有参装饰器

def auth(driver='file'):
    def auth2(func):
        def wrapper(*args,**kwargs):
            name=input("user: ")
            passwd=input('passwd: ')

            if driver == 'file':
                if name=='allen' and passwd=='123':
                    print('登陆成功')
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('登陆失败')
            elif driver=='ldap':
                print('ldap')
        return wrapper
    return auth2

@auth(driver='file')
def foo(name):
    print(name)
foo('allen')

装饰器语法

#被装饰函数的正上方,单独一行
@deco1
@deco2
@deco3
def foo():
    pass
foo=deco1(deco2(deco3(foo)))

装饰器补充:wraps

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)
posted @ 2018-06-04 20:34  墨颜丶  阅读(99)  评论(0)    收藏  举报