__author__ = "Aaron Fan"
import time #导入time模块
user,passwd = 'alex','abc123' #用户名密码
def auth(auth_type): #创建auth函数,创建auth_type形参
#print("auth func:",auth_type) #打印形参auth_type的值
def outer_wrapper(func): #创建outer_wrapper函数,创建func形参
def wrapper(*args, **kwargs): #创建wrapper函数,创建非固定参数*args,**kwargs
#print("wrapper func args:", *args, **kwargs) #打印传进来的这些非固定参数的值
if auth_type == "local": #如果auth函数中的形参auth_type的值等于local
username = input("Username:").strip() #输入用户名
password = input("Password:").strip() #输入密码
if user == username and passwd == password: #如果用户名和密码全部正确
print("\033[32;1mUser has passed authentication\033[0m") #以绿色的颜色打印一句登陆成功的提示语 res = func(*args, **kwargs) # from home #这里主要是为了显示home()函数中的return值:from home
print("---after authenticaion ") #打印一句话
return res #返回定义的res变量的值 else: #否则账号或者密码错误
exit("\033[31;1mInvalid username or password\033[0m")
elif auth_type == "ldap": #如果auth函数中的形参auth_type的值等于ldap
print("搞毛线ldap,不会。。。。") #ldap的处理语句,这里暂时先用一句print代替了,记得后面练习是需要去细化一下 return wrapper #return wrapper
return outer_wrapper #return outer_wrapper # index主页,不需要用户名密码,可以直接登录,所以这里也无需装饰器
def index():
print("welcome to index page") #home页面,需要通过local方式来匹配用户登陆
@auth(auth_type="local") # home = wrapper()
#注意@auth代表auth(),而@auth(auth_type="local")代表outer_wrapper()
#所以这里其实是指 home = outer_wrapper(home) = wrapper
def home():
print("welcome to home page")
return "from home" #bbs页面,需要通过ldap方式来匹配用户登陆
@auth(auth_type="ldap")
def bbs():
print("welcome to bbs page") index()
print(home()) #其实执行的是wrapper() 这个方式会显示home的return值
#home() #其实执行的是wrapper() 这个不会显示return值
bbs() #其实执行的是wrapper()

python3--装饰器高级学习版的更多相关文章

  1. Python装饰器模式学习总结

    装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...

  2. 净心诀---python3装饰器

    python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...

  3. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  4. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  5. python3 装饰器应用举例

    [引子] python 中的装饰器是oop(面向对象编程)设计模式.之装饰器模式的一个应用.由于有语法糖衣的缘故.所以写起来也更加方便 [从一个比较经典的应用场景来讲解装饰器] 有过一定编程经历的工程 ...

  6. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  7. Python学习---装饰器的学习1210

    装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...

  8. python装饰器的学习笔记

    此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习. 一.什么是装饰器 1.从字面意义来看: 是用来给函数装饰打扮的函数 2.理论上可以理解为: (1).不改变函数的运行方式 ...

  9. python3 装饰器

    #Author by Andy#_*_ coding:utf-8 _*_#装饰器的原则及构成:# 原则:# 1.不能修改被装饰函数的源代码.# 2.不能修改被装饰函数的调用方式.# 3.不能改变被装饰 ...

随机推荐

  1. 图解Fiddler如何抓手机APP数据包过滤抓取

    使用fidder抓取浏览器的包相信不是问题,那么使用fidder 抓取app的数据包呢??? 于是,找了一篇博客来学习一下,可以参考一下,根据自己的需求来实现. 在网上自己学习,然后整理了我所用到的, ...

  2. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  3. predis的使用

    predis是PHP连接Redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写. 将session数据存放到re ...

  4. AUL恢复truncate删除的表

    背景 接到用户申告,新毕业的兄弟不小心把数据库中的3个关键表给truncate了,由于这个业务还在测试阶段,系统没有任何形式的备份. 客户的OS平台是windows平台,数据库是Oracle9207 ...

  5. 如何开启 FastAdmin 的顶部导航功能?

    如何开启 FastAdmin 的顶部导航功能? FastAdmin 默认的是侧边导航,但是如果功能多的时候就有会眼花缭乱,使用顶部导航就会清晰很多. 好消息现在已经支持顶部导航,可以在demo.fas ...

  6. Ambari的资源池管理

    操作: YARN→Config→Advanced→Schedule capacity-scheduler=null yarn.scheduler.capacity.default.minimum-us ...

  7. MySQL删除数据库

    drop命令用于删除数据库. drop命令格式:drop database <数据库名>; 例如,删除名为 xhkdb的数据库: mysql> drop database xhkdb ...

  8. ActiviMQ(1)

    1. ActiviMQ是实现JMS接口和规范的消息中间件(Provider), 2. JMS,Java Message Service, java消息服务,是JavaEE中的一个技术 3. JMS规范 ...

  9. FPGA热设计

    任何芯片要工作,必须满足一个温度范围,这个温度是指硅片上的温度,通常称之为结温(junction temperature). ALTERA的FPGA分为商用级(commercial)和工业级(indu ...

  10. FTP mget without prompt

    # ftp 192.168.100.2Connected to 192.168.100.2.220 Microsoft FTP ServiceName (192.168.100.2:root): ja ...