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" ...
随机推荐
- iOS ProtocolBuffer使用介绍
ProtocolBuffer 简介 Protocol Buffer 是google 的一种数据交换的格式 Protocol Buffer 和 XML.JSON一样都是结构数据序列化的工具,但它们的数据 ...
- Postman中的测试脚本(Test scripts)
一.postman测试脚本 测试脚本是在发送请求之后运行的,并且已经从服务器接收到响应. 二.测试举例 1.设置环境变量 pm.environment.set("variable_key&q ...
- C# 读取电脑CPU、主板、硬盘序列号等信息
ManagementObjectSearcher 解析不到头文件,需要手动 Add Referance 需要添加引用:System.Management,然后引入命名空间:using System.M ...
- vue重置data数据为初始状态
vue中: this.$data 获取当前状态下的data this.$options.data() 获取该组件初始状态下的data 所以,下面就可以将初始状态的data复制到当前状态的data,实现 ...
- 最后的 SPRING
其核心JAR包spring-web-5.2.0.RELEASE.jar和spring-core-5.2.0.RELEASE.jar的大小均为1.4MB左右 基于工厂模式实现对象的创建 添加了国际化.事 ...
- 12组-Alpha冲刺-6/6
12组-Alpha冲刺-6/6 一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15573118.html 小组人数:10人 二.冲 ...
- shell 脚本实现二进制安装 LAMP 架构的 wordpress
#!/bin/bash##***********************************************************************#Author: ...
- Windows下更改MySQL数据库的存储位置(10为例子)
有时候,自己安装MySQL的时候都是默然安装路径的,MySQL安装时不能选择数据库文件的安装位置,也没有可用的直接更改数据库目录的工具.之后所新建的数据库默认存储在C盘,当然了C盘很重要什么东西都存过 ...
- 原生django怎么给响应头添加信息
原生django怎么给响应头添加信息 直接在HttpResponse响应对象中添加键值对就行 视图层 ---------------------- def test_func(request): # ...
- vue3 门户网站搭建2-ngnix
路由配好了,需要调试下 build 后是否可用,这时我们需要一个服务端来运行静态网页. 官网直接下载一个 windows 版本的 ngnix 即可: http://nginx.org/en/downl ...