双层装饰器

user_info={}       首先定义一个空字典,作为后面的判断依据

def check_login(func):              装饰器1:用来检查用户是否登录,通过字典user_info里面is_login的键值,当键值存在的时候即(None)表示用户已登录

  def inner(*args,**kwargs):

    if user_info.get("user_login",None):

      ret=func(*args,**kwargs)

      return ret

    else:

      print("请登录")

  return inner

def check_manager(func):            装饰器2:用来检查用户权限,通过user_type键值判断,当键值存在并且为2的时候说明用户具有权限

  def inner(*args,**kwargs):

    if user_info.get("user_login",None)==2:

      ret=func(*args,**kwargs)

      return ret

    else:

      print("权限不够")

  return inner

@check_login()                  函数一:被一个装饰器@check_login装饰,当用户登录后即可调用函数home()

def home():

  print("普通用户")

@check_login                  函数二:被两个装饰器装饰,当用户登录后,并且具有权限才能调用函数manager()

@check_manager                注意:这里两个装饰器分先后,先检查是否登录,然后检查是否具有权限。

def manager():

  print("管理用户")

def login(*args,**kwrags):

  user=input("用户名:")

  pwd=input("密码:")

  if user=="administrator":

    user_info[is_login]=True

    user_info[user_type]=2

  else:

    user_info[is_login]=True

def main():

  choice=input("1 登录,2 查看信息,3 管理")

  if choice=1:

    login()

  elif choice=2:

    home()

  elif choice=3:

    manager()

调用主函数:

main()

实现结果:

未登录前是不能 2 查看信息  3管理

其它用户登录后只能查看“普通用户”

当用administrator登录后,才能查看“管理用户”

    

时间: 2024-10-10 23:35:45

双层装饰器的相关文章

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

Day5 双层装饰器、字符串格式化

双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} def check_login(func): def inner(*args, **kwargs): #.get拿数据时,不存在则默认为None if USER_INFO.get('is_login', None): ret = func(*args, **kwargs) return ret else

python 双层装饰器、格式化、模块、迭代器和生成器

一.双层装饰器 一.双层装饰器 #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO={} #USER_INFO['is_login'] = True #USER_INFO['user_type'] = 2 def check_login(func): def inner(*args ,**kwargs): if USER_INFO.get('is_login',None): ret = func(*args,**kwargs) retur

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

一.python模块(导入,内置,自定义,开源) 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 2.模块的引入 在Python中用关键字

关于闭包即双层装饰器的理解

** 闭包**:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的**自由变量**(未在本地作用域中定义的局部变量),就形成了闭包. 函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数.而这时使用闭包的话就能发挥作用: **保存函数的状态信息,使函数的局部变量信息依然可以保存下来**.形成闭包之后,闭包变量能够随着闭包函数的调用而实时更新,就好像是一个全局变量那样. 我们发现每次再运行该函数,里面的count变量其

自动化运维Python系列(四)之装饰器和生成器

装饰器 在理解什么事装饰器之前,我们需要理解:函数也是一个对象,可以赋值给变量,通过变量来调用 def f1():     print('2016') d = f1 d() 输出: 2016 那么装饰器的作用就是在不改变原函数的前提下,调用这些函数,并且为函数增加我们需要的新功能. 我们平时在编写好很多独立函数模块以后,突然需要在每个模块内添加一个功能,比如: def f1():     print('F1') def f2():     print('F2') def f3():     pr

day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇】

一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封闭:已实现的功能代码块 开发:对扩展开发 装饰器功能: 1)自动执行装饰器下面的函数,并将被装饰器函数的函数名当做参数传递给装饰器函数 2)装饰器函数的返回值,重新赋值给被装饰函数 #装饰器格式:@+函数名 #装饰器格式:@+函数名 def outer(func): def inner(arg):

文成小盆友python-num5 -装饰器回顾,模块,字符串格式化

一.装饰器回顾与补充 单层装饰器: 如上篇文章所讲单层装饰器指一个函数用一个装饰器来装饰,即在函数执行前或者执行后用于添加相应的操作(如判断某个条件是否满足). 具体请见如下: 单层解释器 双层解释器 双层解释器在原理上相同,只是在执行时比单层复杂.见如下实例: 需求: 做一个简单的登录展示,有两个菜单即可一个菜单仅需要登录后就能查看,一个菜单不但需要登录,而且还得需要是超级管理员登录才能查看. 分析:1.可以写一个装饰器,在着一个装饰器中判断是否满足两个条件如果满足着执行函数体,但问题是还有一

day05 Python多层装饰器、模块、字符串格式化、生成器和迭代器、递归

一.多层装饰器 需求如下:     程序运行时需判断当前是否有用户登录,以及当前登录的用户名是否为管理员账户,但有的函数只需判断当前是否有用户登录就可以,有的函数两个都需要判断,所以将这两个判断分开写成两个装饰器,在需要判断时直接使用相应的一个或两个装饰器即可,具体代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- #保存当前登录的账户名及账户类型(管理员为2,普通用户为1) USER_INFO = {} def check_login(func