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 ...
随机推荐
- 题解 洛谷 P4189 【[CTSC2010]星际旅行】
一个比较直接的想法就是对每个点进行拆点,拆成入点和出点,限制放在入点和出点相连的边上,然后跑最大费用最大流即可. 但是这样复杂度无法接受,所以考虑模拟费用流来解决本题. 发现 \(H\) 都大于等于该 ...
- centos7+jexus5.8.3部署ASP.NET的MVC项目
1.在centos7终端以root权限安装jexus5.8.3的独立版 命令:curl https://jexus.org/release/x64/install.sh|sh 2.跳转到目录/usr/ ...
- adb连接多个设备时,选择某个设备
在emulator-5554模拟器上安装ebook.apk: adb -s emulator-5554 install ebook.apk 在真机上安装ebook.apk: adb -s HT9BYL ...
- ~~网络编程(四):socket套接字~~
进击のpython ***** 网络编程--socket socket的中文意思叫做套接字,socket方法其实也叫套接字方法 我们研究过TCP/UDP协议,但是要是让我们自己搭建,就十分困难了 而这 ...
- 手写IOC容器
IOC(控制翻转)是程序设计的一种思想,其本质就是上端对象不能直接依赖于下端对象,要是依赖的话就要通过抽象来依赖.这是什么意思呢?意思就是上端对象如BLL层中,需要调用下端对象的DAL层时不能直接调用 ...
- day20:正则表达式
单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) \d 匹配数字 \D 匹配非数字 \w 匹配数字字母下划线 \W 匹配非数字或字母或下 ...
- Android JNI之静态注册
这篇说静态注册,所谓静态注册,就是native的方法是直接通过方法名的规定格式和Java端的声明处代码对应起来的,其对应规则如下: JNIEXPORT <返回值> JNICALL Java ...
- layui在odoo12上的应用,用widget覆盖原字段视图
layui是一个前端框架,提供了许多前端的组件等,layui的详情自己官网地址:https://www.layui.com/doc/去查看 下面说一下最近用layui遇到的问题和解决方式: 问题:近期 ...
- 使用docker安装nginx并配置端口转发
使用docker安装并运行nginx命令: docker run --name=nginx -p 80:80 -d docker.io/nginx 使用命令: docker exec -it ngin ...
- python5.3二进制文件的读写
fh=open(r"C:\1.png","rb")#转换成二进制数据data=fh.read()#对二进制数据进行读取 fh1=open(r"C:\2 ...