25、多层装饰器:
     1、原理:执行顺序从上往下,#2和#3组成一个函数假设为nf1,#1和nf1组成一个函数nnf1
          f1成为ck_ty_of_us的inner函数即nf1。nf1成为check_login的inner函数即nnf1。详细参照alex的多层装饰器讲解。。
#1 @check_login
#2 @ck_ty_of_us
#3 def f1():
     pass
     2、应用多层装饰器实现用户管理程序如下:
USER_LOGIN = {}
def check_login(func):
    def inner(*args,**kwargs):
        if USER_LOGIN.get('is_login'):
            ret = func(*args,**kwargs)
            return ret
        else:
            print('请先登录')
    return inner
def ck_ty_of_us(func):
    def inner(*args,**kwargs):
        if USER_LOGIN['user_type'] == '2':
            ret = func(*args,**kwargs)
            return ret
        else:
            print('你没有权限')
    return inner
def register(user,pwd):
    with open('xinxi','r+') as f1:
        f1.seek(0,2)
        f1.write(user + '|' + pwd +'|1\n')
def login(user,pwd):
    with open('xinxi','r+') as f5:
        for line in f5:
            if line.strip().startswith(user):
                l2 = line.strip().split('|')
                USER_LOGIN['is_login'] = True
                USER_LOGIN['user_type'] = l2[2]
                print('欢迎%s登陆' %user)
 
@check_login
@ck_ty_of_us#应用的是多层装饰器的功能。
def cpwd(user,pwd):
    with open('xinxi','r+') as f2,open('xinxi2','w') as f3:
        for line in  f2:
            if line.strip().startswith(user):
                l1 = line.split('|')
                l1[1] = pwd
                line1 = '|'.join(l1)
                f3.write(line1)
            else:
                f3.write(line)
 
@check_login
def viewmes(user):
    #普通用户读取自己信息
    list1 = []
    with open('xinxi','r+')  as f4:
        for line in f4:
            if line.strip().startswith(user):
                list1.append(line.strip())
                print(list1)
def main():
    while True:
        chose = input('1.注册 2.登陆 3.修改密码 4.查看自己的信息:')
        if chose == '1':
            username = input('请输入用户名:')
            password = input('请输入密码:')
            register(username,password)
        if chose == '2':
            username = input('请输入用户名:')
            password = input('请输入密码:')
            login(username,password)
        if chose == '3':
            username = input('请输入用户名:')
            password = input('请输入要修改的密码:')
            cpwd(username,password)
        if chose == '4':
            username = input('请输入用户名:')
            viewmes(username)
main()

python 多层装饰器的更多相关文章

  1. python 装饰器 第十一步:多层装饰器的嵌套

    #第十一步:多层装饰器的嵌套 #装饰器1 def kuozhan1(func): #定义装饰之后的函数 def neweat1(): # 扩展功能1 print('1-----饭前洗手') # 调用基 ...

  2. 【转】Python之装饰器

    [转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...

  3. Python闭包装饰器笔记

    Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...

  4. Python设计模式-装饰器模式

    装饰器模式 装饰器模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活. 代码示例 #coding:utf-8 #装饰器模式 class Beverage():   ...

  5. python之装饰器补充与递归函数与二分查找

    目录 多层装饰器 有参装饰器 递归函数 基本演示 斐波那契数列 总结 小拓展 算法之二分法 简介 举例 总结 多层装饰器 我们已经知道了语法糖的作用是将装饰对象自动装饰到装饰器中,一个语法糖的应用我们 ...

  6. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  7. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  8. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  9. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

随机推荐

  1. POJ1860 Currency Exchange(最短路)

    题目链接. 分析: 以前没做出来,今天看了一遍题竟然直接A了.出乎意料. 大意是这样,给定不同的金币的编号,以及他们之间的汇率.手续费,求有没有可能通过不断转换而盈利. 直接用Bellman-ford ...

  2. mklink命令转移win7系统盘文件夹users和programdata(附xp的方法)

    mklink命令转移win7系统盘文件夹users和programdata(附xp的方法)                   使用mklink命令转移文件夹清理臃肿的c盘        (一) 我的 ...

  3. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  4. Flask+Mysql搭建网站之网页设计

    不得不说,本人极度讨厌网页设计,感觉太麻烦了.不过整好啦还蛮有成就感的. 关于网页设计,现在流行的是扁平化设计. http://www.bootcss.com/ http://www.bootcss. ...

  5. 关于Web Api的HelpPage文档注释问题

    之前使用Microsoft.AspNet.WebApi.HelpPage的时候,一直为返回对象的注释发愁,以为这是个BUG. 这个注释的解决办法其实要从其原理理解就明白了. 因为HelpPage是读取 ...

  6. HDFS集群balance(2)-- 架构概览

    转载请注明博客地址:http://blog.csdn.net/suileisl HDFS集群balance,对应版本balance design 6 如需word版本,请QQ522173163联系索要 ...

  7. [转] Console命令详解,让调试js代码变得更简单

    http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上 ...

  8. 大数据笔记02:大数据之Hadoop的生态系统和版本

    1.Hadoop的生态系统: (1)图1: (2)图2: 图1 和 图2 都是形象说明了Hadoop的生态圈. 2.举例介绍Hadoop生态圈的小工具: (1)Hive工具(中文意思:小蜜蜂) 利用H ...

  9. JavaScript 总结

    1. JavaScript prototype属性是一个对象 当一个函数在定义之后 就会自动获得这个属性.其初始值是一个空对象.新建了一个名为Cat的构造函数,其prototype为一个对象,cons ...

  10. iTerm2和oh-my-zsh的个性化定制

    终于在某东做活动新入手了一台air,看身边小伙伴的mac的终端感觉好炫酷,于是乎准备自己也捯饬捯饬,google了一下,发现了osx平台上的终端神器iTerm2和用来代替bash的oh-my-zsh, ...