python关于函数调用作为参数的说明&&装饰器
python关于函数调用作为参数的说明&&装饰器
简单的:
先看代码:
def out():
print('out')
def inner():
return 'inner'
return inner()
if __name__ == '__main__':
print(type(out()))
输出结果:
out
<class 'str'>
我们看到type函数的参数是out(),执行的过程就是:out() --> inner() --> type(inner()),type里的参数实际上是inner, 最后的打印结果就是<class 'str'>。代码通过执行out函数,得到最终的参数。若改成print('inner')结果就是None类型。
复杂的:
代码:
import time
import functools
def timing(status='Train'):
print('1')
def dec(func):
print('2')
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
func1 = func(*args, **kwargs)
print('[%s] time: %.3f s ' % (status, time.time() - start))
return func1
return wrapper
return dec
@timing(status='Train')
def Training():
time.sleep(3)
print('over')
if __name__ == '__main__':
print('main')
print('*' * 10)
print(type(Training()))
输出结果:
1
2
main
**********
over
[Train] time: 3.000 s
<class 'NoneType'>
关于这段带代码,可能疑问点在于在main前面的‘1’‘1’,导致这个的原因是因为timing()函数作为装饰器时执行函数的预处理功能,先timing()函数的执行,先返回dec然后执行dec(),且Training()作为该函数的参数,即dec(Training()),然后就是wrapper()函数。此时Training = timing(dec(Training())),这就是其中的‘1’‘2’的由来,也就是预处理完毕。然后就执行main函数的代码。当执行print(type(Training()))时,就就执行wrapper(),然后就是func1 = fun() = Training() = None。因为Training()函数是打印一句话,所以说返回值为None,所以最后的结果就是None Type。
python关于函数调用作为参数的说明&&装饰器的更多相关文章
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- python带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的类装饰器(和不带参数的类装饰器有很大的不同) # 类装饰器的实现,必须实现__call__和__init_ ...
- Python不带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 不带参数的类装饰器 # 类装饰器的实现,必须实现__call__和__init__两个内置函数. # __init ...
- Python带参数的函数装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...
- python基础6--面向对象基础、装饰器
1.类 class Student: def __init__(self, name, grade): self.name = name self.grade = grade def introduc ...
- 13、python中的函数(闭包与装饰器)
一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- 老男孩python学习自修第十七天【装饰器】
装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...
- python 类中的某个函数作为装饰器
在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return ...
随机推荐
- 一张图就可以完美解决Java面试频次最高、GG最高的题目!快点收藏
如果要问Java面试频次最高的题目,那么我想应该是HashMap相关了. 提到HahMap,必然会问到是否线程安全?然后牵扯出ConcurrentHashMap等,接着提及1.7和1.8实现上的区分, ...
- 技能实际操作:如何为Centos7 配置静态路由?
如图: 业务地址:192.168.10.0/24 ---- 192.168.20.0/24 管理地址:172.168.10.0/24 --- 172.168.20.0/24 需求:每台主机配置两张网卡 ...
- 高效C++:模板和泛型编程
模板和泛型编程的关注重点在编译期,所有的行为都在编译期确定,因此其规则和玩法也有自己特殊的一套,和其他模块不通用. 了解隐式接口和编译期多态 元编程------编译器多态,决定哪个重载函数被调用 cl ...
- 软件测试面试题,十年HR面试经验分享
WeChat[代码小姐],快和我们一起进大厂,挑战高薪吧. 问:你在测试中发现了一个 bug ,但是开发经理认为这不是一个 bug ,你应该怎样解决. 1.将问题提交到缺陷管理库里面进行备案.2. ...
- vue组件库用markdown生成文档
前言: 开发vue组件库需要提供组件的使用文档,最好是有渲染到浏览器的demo实例,既能操作又能查看源代码.markdown作为常用的文档编写载体,如果能在里面直接写vue组件,同时编写使用说明就再好 ...
- webpack 编译时,提示 Unexpected token: keyword «const»
代码里如果用到const 关键字,编译报这种错误 解决方法: npm install terser-webpack-plugin --save 然后,webpack配置: const TerserPl ...
- python txt装换成excel
工作中,我们需要经常吧一些导出的数据文件,例如sql查出来的结果装换成excel,用文件发送.这次为大家带上python装换excel的脚本 记得先安装wlwt模块,适用版本,python2-3 #c ...
- jmeter接口测试 -- status==400(Bad Request)
一.接口请求信息 二.错误的jmeter接口请求 1.请求内容 2.响应内容 三.正确的接口请求 1.看回原本的接口请求信息,company_id = null .这里也就不能空 四.原因分析 1. ...
- Oracle连接报错之IO异常(The Network Adapter could not establish the connection)
简单介绍:自己封装oracle jdbc的一些常用功能jar包,自己本机玩没啥问题,给别人玩儿,发现总是抛异常 IO异常(The Network Adapter could not establish ...
- 为什么Python适合初学者,一般要学习多久
为什么Python适合初学者?一般Python要学习多久?很多人都觉得,Python是一门很好学的语言,非常适合入门.但更多人都是不清楚具体原因的.那么,我们不如一起来看看Python为何更适合初学者 ...