装饰器

装饰器的作用
在不改变函数的调用方式的情况下,给函数的前后添加新功能

# 关于时间
import time  # 模块
# time.sleep(1)
# print(time.time())
# print('===========')

# def timmer(func):
#     start_time = time.time()
#     time.sleep(0.1)
#     func()
#     end_time = time.time()
#     print('=====%s====='%(end_time-start_time))

def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner():  # 在装饰器中需要定义一个内部函数
        print('调用func之前')
        func()  # 被装饰的函数,并且要执行
        print('调用func之后')
    return inner  # 将内部函数的名字返回

@timmer  # 语法糖 func = timmer(func)
def func():
    print('ok')

func()

有参装饰器

def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
        print('调用func之前')
        func(*args,**kwargs)  # 被装饰的函数,并且要执行
        print('调用func之后')
    return inner  # 将内部函数的名字返回

@timmer  # 语法糖 func = timmer(func)
def func(name):
    print('%sok'%name)

@timmer
def func2(a,b):
    print('func2:%s'%(a+b))

func('Y')
func2(5,3)  # inner(5,3)

有返回值的装饰器

def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
        print('调用func之前')
        ret = func(*args,**kwargs)  # 被装饰的函数,并且要执行
        print('调用func之后')
        return ret
    return inner  # 将内部函数的名字返回

@timmer  # 语法糖 func = timmer(func)
def func(name):
    print('%sok'%name)
    return 11

ret = func(name='yxt')
print(ret)

装饰器的固定结构

def wrapper(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
        '''被装饰函数执行之前要添加的代码'''
        ret = func(*args,**kwargs)  # 被装饰的函数,并且要执行
        '''被装饰函数执行之后要添加的代码'''
        return ret
    return inner  # 将内部函数的名字返回

开放封闭原则
开放:
对扩展是开放的
封闭:
对修改是封闭的
装饰器:开放封闭原则

装饰器实例

flag = False
def login(func):
    def inner(*args,**kwargs):
        global flag
        if flag == False:
            username = input('用户名:')
            password = input('密码:')
            if username == 'alex' and password == 'somebody':
                print('登录成功')
                flag = True
        if flag == True:
            ret = func(*args,**kwargs)
            return ret
    return inner

@login
def art():
    print('欢迎来到文章页')

@login
def dar():
    print('欢迎来到日记页')

art()
dar()

 

posted on 2017-11-02 14:54  杨小天  阅读(98)  评论(0编辑  收藏  举报