设为首页 加入收藏

TOP

16、装饰器(二)
2017-09-30 17:48:10 】 浏览:10071
Tags:装饰
饰器装饰同一个函数

1、有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()
带参数的装饰器

2、有些时候,我们也会用到多个装饰器装饰同一个函数的情况

def pipixia(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def qqxing(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@qqxing
@pipixia
def f():
    print('in f')

f()
多个装饰器装饰同一个函数

多个装饰器装饰同一个函数执行顺序:


 

思维导图:

 

预习解答:

#编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,
#后续的函数都无需再输入用户名和密码
# tag = True
tag = [True]
def rz(func) :
    def inner() :
        # global tag
        # while tag :
        while tag[0] :
            name = input("please input your name:").strip()
            passworld = input("please input your passworld:").strip()
            with open("demo.py", 'r', encoding='utf-8') as read_f :
                print()
                if read_f.readline() == name+"\n" and read_f.readline() == passworld+"\n" :
                    # tag = False
                    tag[0] = False
        func()
    return inner

@rz
def func() :
    print("lln")
@rz
def func1() :
    print("lln1")
@rz
def func2() :
    print("lln2")

func()
func1()
func2()




#方法二:(推荐)
auth_status = {
    'user':None,
    'status':False
}

def auth(func):
    def inner(*args,**kwargs):
        if auth_status['status']:
            ret = func(*args, **kwargs)  # index/home
            return ret
        else:
            username = input('username : ').strip()
            password = input('password : ').strip()
            # 读文件获取用户信息
            f = open('conf')
            user_info = f.read()
            user_dic = eva l(user_info)
            if user_dic.get(username) and user_dic[username] == password:
                print('login successful')
                auth_status['user'] = username
                auth_status['status'] = True
                ret = func(*args,**kwargs)  #index/home
                return ret
            else:
                print('login failed')
    return inner

@auth
def index():
    print("欢迎来到首页")

@auth
def home():
    print("欢迎回家")

index()
index()
home()
index()
预习1答案

 

url_l = []
from urllib.request import urlopen

def get_cache(func):
    def inner(*args,**kwargs):
        url = args[0]
        filename = str(hash(url))
        if url in url_l:
            f = open(filename,'rb')
            ret = f.read()
        else:
            url_l.append(url)
            ret = func(*args, **kwargs)
            f = open(filename,'wb')
            f.write(ret)
        f.close()
        return ret
    return inner

@get_cache
def get(url):
    return urlopen(url).read()

print(get('http://www.cnblogs.com/liluning/'))
print(get('http://www.cnblogs.com/liluning/'))
print(get('http://www.cnblogs.com/liluning/'))
print(get('http://www.cnblogs.com/liluning/'))
print(get('http://www.cnblogs.com/liluning/'))
预习2答案

 

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python 深、浅拷贝 下一篇学习笔记TF032:实现Google Incept..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目