__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. Git学习资源收集汇总

    伴随着知乎上一个问题:GitHub 是怎么火起来的?被顶起200+的回答说到:Github不是突然火起来的,在Ruby社区Github其实从一开始就很流行,我们2009年搞Ruby大会就邀请了Gith ...

  2. WCF 配置文件

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.S ...

  3. NSArray四种遍历方法

  4. 调用 SSPI 失败,请参见内部异常 解决方法

    2017-11-12 12:49:53:706] OnServerConnectionAvailable error : System.Security.Authentication.Authenti ...

  5. tensorflow学习笔记(三十九):双向rnn

    tensorflow 双向 rnn 如何在tensorflow中实现双向rnn 单层双向rnn 单层双向rnn (cs224d) tensorflow中已经提供了双向rnn的接口,它就是tf.nn.b ...

  6. 转: 使用Jmeter创建ActiveMQ JMS POINT TO POINT请求,环境搭建、请求创建、插件安装、监听服务器资源等

    转自:http://www.cnblogs.com/qianyiliushang/p/4348584.html 准备工作: 安装JDK,推荐使用1.7以上版本,并设置JAVA_HOME 下载Jmete ...

  7. mysql + keepalived架构

    mysql + keepalived架构 文档(这个文章共有三篇): http://blog.itpub.net/27000195/viewspace-1364706/

  8. nginx学习资源

    在了解nginx的时候 看到的一些资源: https://www.cnblogs.com/EdwinChan/p/8350984.html http://tengine.taobao.org/book ...

  9. 关于ESXI能虚拟出多少个虚拟机和CPU的关系

    当你的虚拟机报如下错误的时候: esxi5.0版本最高配置: https://www.vmware.com/content/dam/digitalmarketing/vmware/zh-cn/pdf/ ...

  10. thinkphp中配置信息的二维数组设置与使用

    有时候配置信息是二维数组 1.配置 <?php return array ( // 阿里大鱼短信配置 'dayu_appkey'=>'xxx', 'dayu_secretKey'=> ...