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 ...
随机推荐
- 完美解决pycharm 不显示代码提示问题
pycharm 不显示代码提示 1.检查IDE省电模式是否关闭状态!!! file → power save mode 取消掉 2.检查代码提示是否成功开启. setting → Inspection ...
- ngx lua获取时间戳的几种方式
原创自由de单车 最后发布于2017-02-14 14:58:43 阅读数 18218 收藏 在ngx_lua里,获取时间相关信息的方式大概有4种(见下面代码): print(string.forma ...
- matplotlib柱状图、面积图、直方图、散点图、极坐标图、箱型图
一.柱状图 1.通过obj.plot() 柱状图用bar表示,可通过obj.plot(kind='bar')或者obj.plot.bar()生成:在柱状图中添加参数stacked=True,会形成堆叠 ...
- Centos 7 下安装PHP7.2(与Apache搭配的安装方式)
(1)源码包下载 百度云下载地址:https://pan.baidu.com/s/1xH7aiGYaX62wij4ul5P-ZQ 提取码:m9zc (2)安装php依赖组件: yum -y insta ...
- Spring main方法中怎么调用Dao层和Service层的方法
在web环境中,一般serviceImpl中的dao之类的数据库连接都由容器启动的时候创建好了,不会报错.但是在main中,没有这个环境,所以需要获取环境: ApplicationContext ct ...
- Jenkins部署jmx脚本
针对jenkins+jmeter做接口自动化,jmeter完成测试脚本录入和撰写,而jenkins负责持续集成和报告收集.那么从零实现jenkins可以从以下角度实现 首先需要安装jenkins ...
- VulnHub靶场学习_HA: Pandavas
HA: Pandavas Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-pandavas,487/ 背景: Pandavas are the warr ...
- Springboot 多数据源配置,结合tk-mybatis
一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...
- 使用property取代getter和setter方法
class Days(object): def __init__(self): self.__days = 0 @property def days(self):#获取函数,名字是days days ...
- C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制!
我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1.9.10.297.952 等,一个数字最多能表示九,如果要表示十.十一.二十九.一百等,就需要多个数字组合起来. 例如表示 5+8 的结果 ...