04-python 学习第四点-装饰器
装饰器就是一个函数,他是通过不修改某个函数的源代码和调用方式的前提下可以添加新功能的一种函数。在python 中装饰器一般采用高阶函数和嵌套函数达到装饰的作用,下面进行实例讲解:
1、目前有一个网址有很多页面(比如:index,home,bbs)。因为时老文字,所有页面都是可以直接浏览的。实现效果如下:
def home():#模拟网页homne
print("wolcome to home") def bbs():#模拟网页bbs
print("wolcome to bbs") index() #调用index
home() #调用home
bbs() #调用bbs
运行结果如下:各个网站均可以直接浏览
wolcome to index
wolcome to home
wolcome to bbs
2、公司有了新规定要求主页indezx 保留原始状态直接浏览,home 和bbs 需要登录才能浏览,不允许修改目前的函数源代码和调用方式实现这个功能。这下则么办呢?
我们可以为需要登录才能浏览的网页home 和bbs 函数进行装饰即可。
user, passwd = 'dwdar', 'abc123' # 模拟用户名密码数据库 def auth(func): # 登录装饰器
def wrapper():
username = input("UserName:").strip()
password = input("Password:").strip()
if user == username and passwd == password:
print("登录成功")
func()
else:
exit("验证失败!") return wrapper def index():
print("wolcome to index") @auth # home 被装饰(没有修改源代码和调用方式)
def home():
print("wolcome to home") @auth # bbs被装饰(没有修改源代码和调用方式)
def bbs():
print("wolcome to bbs") index()
bbs()
home()
运行结果:
index 直接可以显示
wolcome to index
随后要求输入用户名和密码,登录后才能浏览home 和bbs
UserName:dwdar
Password:abc123
登录成功
wolcome to bbs
UserName:dwdar
Password:abc123
登录成功
wolcome to home
3、通过几年的发展,网站又有了新的要求,home 这个函数需要返回值了,需要我们更新以下装饰器。
假设home的返回值是这样的。
@auth # home 被装饰(没有修改源代码和调用方式)
def home():
print("wolcome to home")
return "from home" #home 需要返回值
目前的装饰器是无法实现返回值的,我们对装饰器进行如下升级即可打印返回值了。
# Author:Dwdar user, passwd = 'dwdar', 'abc123' # 模拟用户名密码数据库 def auth(func): # 登录装饰器
def wrapper(*args,**kwargs):
username = input("UserName:").strip()
password = input("Password:").strip()
if user == username and passwd == password:
print("登录成功")
res = func(*args,**kwargs)
return res
else:
exit("验证失败!") return wrapper def index():
print("wolcome to index") @auth # home 被装饰(没有修改源代码和调用方式)
def home():
print("wolcome to home")
return "from home" # home 需要返回值 @auth # bbs被装饰(没有修改源代码和调用方式)
def bbs():
print("wolcome to bbs") index()
bbs()
print(home()) #打印home的返回值
4、又过了一段时间,网站又有了新变化,要求BB 用本地认证系统登录,而BBS需要ldap 认证服务器登录。这下怎么办呢?
第一步:首选我们想到调用装饰器需要传参,通过装饰器参数来判断调用方式。调用装饰器如下。
def index():
print("wolcome to index") @auth(auth_type="local") # 装饰器需要传参,通过参数判断登录方式
def home():
print("wolcome to home")
return "from home" @auth(auth_type="ldap") # 装饰器需要传参,通过参数判断登录方式
def bbs():
print("wolcome to bbs")
第二步:装饰器再添加一层函数 outer_wrappr 来接收相关参数最终可以实现判断。
完整代码如下:
# Author:Dwdar
'''
有一个网址有多个页面,大部分页面时直接浏览的。比如index
后来有了新的要求:
要对home 和页面BBS页面登录才能预览。通过装饰器需要给home 和BBS 添加登录的功能怎么做呢? ''' user, passwd = 'dwdar', 'abc123'
bbsuser, bbspasswd = 'bbs', 'bbs123' # 模拟ldap 认证账号 def auth(auth_type):
# print("auth func:", auth_type) def outer_wrappr(func):
def wrapper(*args, **kwargs):
# print("wrapper func arges:", *args, **kwargs)
if auth_type == "local":
username = input("UserName:").strip()
password = input("Password:").strip()
if user == username and passwd == password:
print("登录成功")
res = func(*args, **kwargs)
return res
else:
exit("验证失败!")
elif auth_type == "ldap":
username = input("bbsUserName:").strip()
password = input("bbsPassword:").strip()
if bbsuser == username and bbspasswd == password:
print("登录成功")
res = func(*args, **kwargs)
return res
else:
exit("BBS验证失败!") return wrapper return outer_wrappr def index():
print("wolcome to index") @auth(auth_type="local") # 装饰器需要传参,通过参数判断登录方式
def home():
print("wolcome to home")
return "from home" @auth(auth_type="ldap") # 装饰器需要传参,通过参数判断登录方式
def bbs():
print("wolcome to bbs") index()
bbs()
print(home())
运行结果:
wolcome to index
bbsUserName:bbs
bbsPassword:bbs123
登录成功
wolcome to bbs
UserName:
通过判断登录BBS需要输入用户名:BBS的账号和密码才能进入。
04-python 学习第四点-装饰器的更多相关文章
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- Python学习——迭代器&生成器&装饰器
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...
- 从零开始的Python学习Episode 11——装饰器
装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- Python学习系列之装饰器
装饰器的作用 装饰器用于装饰某个函数.方法或者类,它可以让这个函数执行之前或者执行之后做一些操作 手工实现一个装饰器 def outer(some_func): #装饰器 $1 def inner() ...
- Python学习日记(九) 装饰器函数
1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...
- Python 学习 —— 进阶篇(装饰器、类的特殊方法)
Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例: def log(f): def fn(x): print ' ...
随机推荐
- .Net串口通讯中的若干问题(C#多串口硬件识别、热插拔、Close方法报错问题、IsOpen的可靠性问题)
一.需求场景 最近有时间静下心来研究SDK,串口通讯的.要求实现识别cp210x和cp2303驱动的两款硬件,并且2303的优先级高,即有2303识别之,没有再识别210x:要求实现热插拔,拔掉自动断 ...
- drools决策表的使用
决策表我们在drools规则引擎初探里做了简单介绍,这里主要是介绍如何通过java代码来把这个excel文件和drools关联起来,如何使其达到我们想要的效果. 这里假设我们在resources目录下 ...
- 【转】WebResource实现在自定义控件中内嵌JS文件
在类库中的资源 其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...
- 【学术篇】SDOI2017 数字表格
======传======送======门======在======里======面====== 去年忘记可以预处理了... 然后就打了10pts的暴力... 现在学了莫比乌斯反演就可以来做了 这个题 ...
- Java 异常基本结构
异常的定义:阻止当前方法或作用域继续执行的情况,即程序无法正常执行下去称之为异常. 异常的基本结构: 所有不正常的类都继承与Throwable类,包括Error类和Exception类 Error一般 ...
- vue cli2.x配置多环境打包
一.安装 npm install --save-dev cross-env 二.配置步骤 1.修改config下的文件 //test.env.js 'use strict' module.export ...
- LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)
传送门 解题思路 玄学树形\(dp\),题目描述极其混乱...看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟.所以 ...
- BZOJ 1040 (ZJOI 2008) 骑士
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- https 生成秘钥
#生成一个RSA秘钥 openssl genrsa -des3 -out a_com.key 1024 #生成一个证书请求openssl req -new -key a_com.key -out a_ ...
- docker企业级镜像仓库harbor
第一步:安装docker和docker-compose 第二步:下载harbor-offine-installer-v1.5.1.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.cf ...