python_3 装饰器参数之谜
装饰器参数之谜
之前已经初步了解过装饰器了,知道了装饰器可以“偷梁换柱”,在不改变函数的调用方式和函数内容的时候,而把函数的功能偷偷地修改。
那么问题来了,如果被修改的函数中有参数的话,怎么样去写这个装饰函数呢?Ok,废话不多说,先上程序:
def func(bar):
def dec():
bar()
print("this is dec")
return dec
@func #test1 = func(test1)
def test1(name):
print("this is test1 and I'm",name)
test1()
很显然,程序会报错:
in dec bar()
TypeError: test1() missing 1 required positional argument: 'name'
报错说test1()缺少位置参数'name',ok,我们来看程序,首先@func中,func(bar)中执行的是: bar = test1,func()中的内容并没有执行,然后就将dec作为返回值返回,此时,相当于执行了:test1 = dec,然后给test1加了个(),也就是调用text1(),那么其实就是相当于调用的是dec,也就是dec(),那么把参数放到dec中就OK了,也就是dec(name),当然,下面跟着执行的bar()其实是执行test1(),给他括号中也添加上name就可以了。问题解决。如下:
def func(bar):
def dec(name):
bar(name)
print("this is dec")
return dec
@func #test1 = func(test1)
def test1(name):
print("this is test1 and I'm",name)
test1("Jack")
输出:
this is test1 and I'm Jack
this is dec
OK,问题2,如果被装饰的函数有好多个呢?其中有的函数不需要参数,有的函数需要3个,有的函数需要9个,这样的话,同一个装饰器装饰不同的函数肯定是会报错的,因为不同的函数的参数是不同的。那么如何解决呢?这里有一个非固定参数的表示办法,有参数你就传进来,没参数就不用你传,也不会报错。是不是很棒?程序如下:
def func(bar):
def dec(*args,**kwargs):
bar(*args,**kwargs)
print("this is dec")
return dec
@func #test1 = func(test1)
def test1(name):
print("this is test1 and I'm",name)
@func
def test2():
print("this is test2")
test1("Jack")
test2()
输出为:
this is test1 and I'm Jack
this is dec
this is test2
this is dec
是不是很方便,并且不管你需要装饰的函数有多少参数都无所谓,这个统统包容。
python_3 装饰器参数之谜的更多相关文章
- Python装饰器探究——装饰器参数
Table of Contents 1. 探究装饰器参数 1.1. 编写传参的装饰器 1.2. 理解传参的装饰器 1.3. 传参和不传参的兼容 2. 参考资料 探究装饰器参数 编写传参的装饰器 通常我 ...
- 一个关于python装饰器参数的问题
看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...
- python 装饰器 第八步:使用类来作为装饰器参数
#第八步:使用类作为装饰器参数 #装饰器使用的操作类 class Wish: #祈求方法 def before(): print('饭前洗洗手') #还愿方法 def after(): print(' ...
- python装饰器参数那些事_接受参数的装饰器
# -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...
- pytho装饰器参数那些事_inspect.getcallargs
''' Created on Jul 26, 2019 @author: tomcat ''' import inspect def chack_admin(func): def wrapper(*a ...
- 装饰器参数加log
#有多个函数,需要计算他们的执行时间,加logimport timedef logger(flag): def show_time(f): #foo对象 def inner(*x,**y): star ...
- Python带参数的装饰器
在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...
- Python装饰器AOP 不定长参数 鸭子类型 重载(三)
1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被 ...
- typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
随机推荐
- RestTemplate发起http请求中文乱码问题解决方案
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); MediaType t ...
- 高端面试必备:一个Java对象占用多大内存
这个问题一般会出现在稍微高端一点的 Java 面试环节.要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型. Java 对象模型 HotSpot JVM 使用名为 oops (Ordi ...
- Error running 'DemoApplication': No jdk for module 'demo' 没有jdk
方案1----- 按理说jdk都是在File->Project Structure里面设置就可以了,而且现在检查了也是没有问题 后来几经折腾,通过直接搜索Settings里面的jdk,发现还有这 ...
- [leetcode]Q133Clone Graph
克隆图记住:一个map一个queue,照葫芦画瓢BFS 找到一个节点就画一个对应的新的,用map对应,然后添加邻居,记录邻居到queue public UndirectedGraphNode clon ...
- Android硬件访问服务中的HAL-查看打印的信息
JNI 向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...
- ip,子网掩码,网关以及dns简述
ip 描述 ip地址用于标识不同的计算机身份,ip地址=网络地址+主机地址 例子 192.168.1.168(ip地址)=192.168.1.0(网络地址)+0.0.0.168(主机地址) 寻址过程 ...
- vue项目中的路由守卫
路由守卫的意义就相当于一个保安一样,作用很大,在实际的项目中运用也是不少,也就是当客户在登陆自己账号的时候,有可能存在客户有啥事的时候,自己后台或者pc的关闭全部浏览器,没有点击退出登录,或者在退出登 ...
- Dockerfile文件说明
文件说明 此文件用于docker镜像文件的制作 基本结构 Dockerfile文件由行命令组成,以#开头注释行 一般分为四部分,基础镜像信息.维护者信息.镜像操作指令和容器启动执行指令. 例如 #De ...
- 废弃fastjson!大型项目迁移Gson保姆级攻略
前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...
- 利用github给国外文件下载加速
前言 作为一名程序员,经常需要下载一些编程相关的环境,而国内的网络环境大家都知道,有的文件用浏览器是下载不动的,于是我有了利用github下载文件的想法. 我的demo项目地址:https://git ...