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 ' ...
随机推荐
- java OOP第03章_继承、抽象类和抽象方法
一. 为什么需要继承: 若多个类中都需要一些属性和方法,那么就可以将属性和方法抽取到一个父类中,需要的子类可以通过extends关键字去继承这个父类后拥有相应的属性和方法. 类.数组.方法----引用 ...
- Navicat Premium_11.2.7 安装及破解,连接Oracle数据库
下载Navicat Premium_11.2.7简体中文版, 安装 Navicat 11 for Windows 系列原版程序.Navicat | 下载 Navicat 14 天 Windows.Ma ...
- 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易
DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...
- MAMP 安装 php 扩展
1.官网下载所对应的php 版本http://php.net/get/php-5.3.29.tar.gz/from/a/mirror 2.解压 找到需要的扩展目录 例如我要的是shmopcd ~/Do ...
- 小程序template怎样渲染页面的
template模板渲染demo wxml页面 <view class="btmcon"> <text class="btmtitle"> ...
- Java 多线程 - 创建线程的方法 + Executors.newXXXThreadPool()缺点
java中创建线程的三种方法以及区别: https://www.cnblogs.com/3s540/p/7172146.html 通过Executor 的工具类,创建三种类型的普通线程池: https ...
- Map按键排序(sort by key)
1.需求:已知有如下map,要求按照key倒序排列遍历. Map<String, Integer> map = new HashMap<>(); map.put("1 ...
- scrapy - 给scrapy 的spider 传值
scrapy - 给scrapy 的spider 传值 方法一: 在命令行用crawl控制spider爬取的时候,加上-a选项,例如: scrapy crawl myspider -a categor ...
- R:ggplot2数据可视化——进阶(2)
Part 2: Customizing the Look and Feel, 更高级的自定义化,比如说操作图例.注记.多图布局等 # Setup options(scipen=999) librar ...
- POJ 1269 /// 判断两条直线的位置关系
题目大意: t个测试用例 每次给出一对直线的两点 判断直线的相对关系 平行输出NODE 重合输出LINE 相交输出POINT和交点坐标 1.直线平行 两向量叉积为0 2.求两直线ab与cd交点 设直线 ...