python装饰器中高级用法(函数加参)
在上一章我们说到装饰器的原则和基本用法,下面来补充一下:如果函数加参,装饰器该如何变化
1,还是用上一章的源代码

2,给test2加个参数name

报错了,本来给test2加一个name参数,为了实现“li”能成功添加到test2里,按一般添加函数的方法没有错,但是报错显示没有“li”这个参数值。忽略了函数在被调用到装饰器里发生了什么变化
2,修改装饰器,让装饰器调用到test2的参数

还是报错了,仔细看,当我们在添加了装饰器中函数值后,按正常思路走,test2的name值应该也会被
f() 和 d()调用才对,其实是对的,如下
3,将test1注释掉,因为上图报错显示test1没有参数

这时候只输出test2,发现添加参数成功,是的,这样其实就是成功了,但是问题来了,如果一个程序里有的函数需要加参数,有的函数不需要加参数,那怎么弄?如果是这样的话,就会出现 2 步骤中的报错
4,在装饰器里用“ * ” 号来针对不加参和加参的混合应用

这里我们在 agr 前加上 * 号 ,再次运行,发现test1没有报错了。加“*” 号 其实就是为了函数的混合用法
(结合上一篇博客,装饰器这样的应用,其实已经满足日常百分之九十的工作了)
下面要说一个高级用法
例子:公司有很多的网站页面需要输入操作,我们在python里,用一个函数代表一个页面来完成
如图:

运行后:

这是没有用到会话,只是直观的体现,这样的方式网上有很多种,这种方式可以说是经典之作
*********补充:如果home函数有返回值,装饰器需做返回结果的修改,如下图**********

执行后:
:OK
高潮来了:还是以上的代码,看代码我们发现,代码这里的home和bbs认证方式是一样的,都是开头定义好的,但是在真正的实际环境里,网页的认证有很多种,ssh,加密,密钥认证等,甚至在同一组网页中,每一个网页的认证方式可能都不一样。这里假设Home和bbs的认证方式不一样,那应该如何修改装饰器来适应变化呢?
这需要添加的东西就比较多了,先看添加完后的代码


图的解释就不细说了(文字描述太多),这里最好实践一下,然后加上断点,一步步走一遍就明白了
到此python装饰器大致就了解并可以运用了,还有很多方式,一切都是以工作中遇到的问题来对应想办法解决
python装饰器中高级用法(函数加参)的更多相关文章
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- python装饰器内获取函数有用信息方法
装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...
- python装饰器 高阶函数 函数闭包
1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...
- 一篇文章搞懂Python装饰器所有用法
01. 装饰器语法糖 如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上 ...
- Python装饰器高级用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...
- Python装饰器主要用法
#!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' user = "admin" passwd = ...
- Python装饰器和回调函数
1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...
- python 装饰器统计某个函数的运行时间
import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...
- python装饰器的用法
def logger(func): def inner(*args, **kwargs): #1 print "Arguments were: %s, %s" ...
随机推荐
- 退役*CPCer的找实习总结
从2月底开始到今天,我终于拿到了第一个也是唯一一个offer(字节跳动).找实习的过程告一段落,所以想记录一下这段时间的经历. 最开始找$meopass$学长内推了小马智行,很快就接到了面试通知(再次 ...
- 关于elasticsearch使用ceph作为存储
首先关于这个问题本人已经持续关注很长时间了,先说结果--elasticsearch(ES)不适合不适合不适合使用分布式存储.测试环境当然无所谓!!! 以下是相关资料的链接(持续更新): 1.https ...
- Vue 项目中实现的微信、微博、QQ空间分享功能(亲测有效)
需求:文章添加分享功能(包括微信.微博.QQ空间) 如下图所示: 点击图标分别跳转到如下界面:(实现效果如下) 话不多说直接代码(可以封装成组件) <template> <div c ...
- JDK卸载与JDK12 安装
JDK卸载与JDK12 安装 一.JDK卸载 控制面板>程序和功能>jdk程序(java 8 update 391:java SE Development Kit8 update 391) ...
- TPS,RPS,QPS,RT的区别
以下是对性能中各项指标的解释: 1.TPS:Transaction Per Second,服务器每秒处理事务数,是衡量系统性能的一个非常重要的指标. 计算公式:TPS= 总请求数 / 总时间. ...
- Linux系统下修改KVM虚拟机配置
一. 安装虚拟机 1. 设备重启进入BIOS,打开SMMU.F10保存退出 2. 进入系统后安装线管组件 virt-install qemu-kvm qemu-img virt-manager lib ...
- 2、k8s 基础环境安装
3 k8s 环境配置 3.1 基础环境准备 所有机器执行 #各个机器设置自己的域名 我的设置为 hostnamectl set-hostname ks8-master.hostnamectl set- ...
- C#连Mysql数据库报错 SSL Connection error
MySql.Data.MySqlClient.MySqlException (0x80004005): SSL Connection error. ---> System.AggregateEx ...
- axios和ajax对响应是文件流用blob处理
先看axios请求处理,下载文件 this.$axios.get(api.exportMortgageOrderExcelVisit, { params: params, responseType: ...
- SQL server数据库 账户SA登录失败,提示错误:18456
在我们使用数据库的时候,偶尔会遇到一些登录上的错误提示.比如,在数据库配置上没有正确开启用户的登录策略以及服务器身份验证模式时,就会提示"用户'sa'登录失败.(Microsoft SQL ...