Python装饰器

开放封闭原则:对拓展是开放的,对修改是封闭的

装饰器:装饰他人的工具,装饰的目的是为他人添加新功能

装饰器本身是任意可调用对象,被装饰的对象本身也可以是任意可调用的对象

装饰器遵循的原则:1、不修改被装饰对象的源代码

         2、不修改被调用对象的调用方式

装饰器的目的:在遵循1和2原则的前提下,为其他函数添加新功能

@装饰器名:必须写在被装饰对象的正上方,且是单独一行

#Author wangmengzhu
import time
def timmer(func):
    def wrapper():
        start = time.time()
        func()
        stop = time.time()
        print('run time is %s '%(stop - start))
    return wrapper
@timmer
def index():
    time.sleep(3)
    print('welcome to index')
index()


import time
def timmer(func):
    def wrapper(*args,**kwargs):##对于有参和无参都可以传入
        start = time.time()
        res = func(*args,**kwargs)
        stop = time.time()
        print('run time is %s '%(stop - start))
        return res
    return wrapper
@timmer
def index(name):
    time.sleep(3)
    print('%s welcome to index'%(name))
    return 'lala'
res = index('susu')
print(res)

有参装饰器

current_user = {'user':None}
def auth(func):
    def wrapper(*args,**kwargs):
        if current_user['user']:
            res = func(*args, **kwargs)
            return res
        else:
            name = input('请输入你的用户名>>: ').strip()
            password = input('请输入你的密码>>: ').strip()
            with open('db.txt', encoding='utf-8') as f:
                info = f.read()
                info_dic = eval(info)
            if name in info_dic and password == info_dic[name]:
                res = func(*args, **kwargs)
                current_user['user'] = name
                return res
            else:
                print('name or password not exists')
    return wrapper
@auth
def index():
    print('from index')
@auth
def foo(name):
    print('%s welcome to this page'%(name))
index()
foo('egon')
current_user = {'user':None}
def deco(auth_type = 'file'):
    def auth(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                if current_user['user']:
                    res = func(*args, **kwargs)
                    return res
                else:
                    name = input('请输入你的用户名>>: ').strip()
                    password = input('请输入你的密码>>: ').strip()
                    with open('db.txt', encoding='utf-8') as f:
                        info = f.read()
                        info_dic = eval(info)
                    if name in info_dic and password == info_dic[name]:
                        res = func(*args, **kwargs)
                        current_user['user'] = name
                        return res
                    else:
                        print('name or password not exists')
            elif auth_type == 'mysql':
                pass
            else:
                print('not valid')
        return wrapper
    return auth
@deco()
def index():
    print('from index')
@deco()
def foo(name):
    print('%s welcome to this page'%(name))
index()
foo('egon')
# func()
# 完整的装饰-万能的装饰
def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner(*args,**kwargs):      #在装饰器中需要定义一个内部函数
        print('调用func之前')
        ret = qqxing(*args,**kwargs)      #被装饰的函数,并且要执行
        print('调用func之后')
        return ret
    return inner      #将内部函数的名字返回

@timmer   #语法糖  func = timmer(func)
def func(name):
    print('%s的公司好老板好同事好'%(name))
    return 1111111111

ret = func('俊杰')
print('result : %s'%ret)

#装饰器的固定结构
def wrapper(func):
    def inner(*args,**kwargs):
        """被装饰函数执行之前要添加的代码"""
        ret = func(*args,**kwargs)
        """被装饰函数执行之后要添加的代码"""
        return ret
    return inner

 

posted @ 2017-11-03 15:22  黄骁瀚cerny  阅读(179)  评论(0编辑  收藏  举报