在上一章我们说到装饰器的原则和基本用法,下面来补充一下:如果函数加参,装饰器该如何变化

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装饰器中高级用法(函数加参)的更多相关文章

  1. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  2. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  3. python装饰器内获取函数有用信息方法

    装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...

  4. python装饰器 高阶函数 函数闭包

    1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...

  5. 一篇文章搞懂Python装饰器所有用法

    01. 装饰器语法糖 如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上 ...

  6. Python装饰器高级用法

    在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...

  7. Python装饰器主要用法

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' user = "admin" passwd = ...

  8. Python装饰器和回调函数

    1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...

  9. python 装饰器统计某个函数的运行时间

    import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...

  10. python装饰器的用法

    def logger(func):    def inner(*args, **kwargs): #1         print "Arguments were: %s, %s" ...

随机推荐

  1. 安装centos,ubuntu系统

    安装centos系统 1.首先进入VMware,新建虚拟机,选择典型,然后下一步 2.稍后安装系统,下一步 3.因为此次安装的是centos7.9系统,因此版本选择7 64位,下一步 4.选择虚拟机的 ...

  2. MavenDependencies 报错缺少jar包

    1.首先看你的工程是否是maven项目,如果不是,则先转换为maven项目. 如果已经是maven项目了,maven的依赖库无法添加,则移步2: 2.项目右键,选择maven,然后子菜单,选择&quo ...

  3. 电脑安装不同版本的QT

    系统:windows Qt版本:5.10/5.13 电脑中已经安装5.10版本的,安装5.13版本的不知道是否会出现问题,故此记录. 下载安装Qt5.13,安装过程跟之前版本的基本没差别,安装路径 D ...

  4. c# 服务端接入个推指定对象消息推送

    个推消息推送主要步骤:1.获取鉴权token 2.发送推送消息 1.获取鉴权token(会过期,需要间隔时间获取一次): tokenUrl = "https://restapi.getui. ...

  5. C#连Mysql数据库报错 SSL Connection error

    MySql.Data.MySqlClient.MySqlException (0x80004005): SSL Connection error. ---> System.AggregateEx ...

  6. jdbc中druid连接池遇到的问题和jdbcTemplate

    无效的源发行版11 这是jdk版本不一致,去项目结构里排查一下 严重: init datasource error com.mysql.jdbc.exceptions.jdbc4.MySQLNonTr ...

  7. AMBA-AXI学习笔记

    transfer与transaction的区别: transfer是只需要一次Valid和Ready握手的单次信息交换过程. transaction是一次完整的突发传输,包括地址transfer,一个 ...

  8. vue3介绍-vue3创建项目-setup函数-ref和reactive-计算属性和监听-生命周期-toRefs-script setup的作用和lang=ts-vue后台管理模板

    目录 vue3介绍-vue3创建项目-setup函数-ref和reactive-计算属性和监听-生命周期-toRefs-script setup的作用和lang=ts-vue后台管理模板 昨日内容回顾 ...

  9. redis缓存一致性

    redis缓存一致性 redis是目前使用最广泛的分布式缓存系统,几乎每家公司都在用.它使用简单,吞吐量高,单机 qps 可以达到 10 万每秒,但在使用redis缓存时存在一个问题,即如何保证缓存数 ...

  10. 002. html篇之《表格》

    html篇之<表格> 1. 结构 <table> <!-- 表格标签 --> <caption>标题,自动居中对齐</caption> &l ...