python中的修饰符@的作用
1.一层修饰符
1)简单版,编译即实现
在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函数调用时就能够知道是什么时候调用的,但是你不想手动地去给每个函数添加,那么就能够使用该修饰符实现这样的功能,下面举例说明:
#coding=UTF-
import time def showTime(fn):
print('calling time : ', time.time())
fn() #调用传入的参数 @showTime
def function1():
print('running function1 ') @showTime
def function2():
print('running function2 ')
返回:
calling time : 1567076890.053299
running function1
calling time : 1567076890.0533462
running function2
但是发现showTime()函数这样子写,即使将fn()行调用代码删除,也会在编译时就输出时间信息:
import time
def showTime(fn):
print('calling time : ', time.time()) @showTime
def function1():
print('running function1 ') @showTime
def function2():
print('running function2 ')
返回:
calling time : 1567077493.420067
calling time : 1567077493.420131
而且这个时候如果调用function1()会报错:
TypeError: 'NoneType' object is not callable
2)调用才实现
如果去希望是在显示调用function1()和function2()函数时才显示时间,正确的写法是:
import time def showTime(fn):
def getTime():
print('calling time : ', time.time())
fn() #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
return getTime @showTime
def function1():
print('running function1 ') @showTime
def function2():
print('running function2 ') function1()
function2()
返回:
calling time : 1567077669.2308512
running function1
calling time : 1567077669.230927
running function2
3)传入参数
如果函数中需要传入参数:
def showTime(fn):
def getTime(*args):#*args获得fn的参数
print('args is : ', args) #查看传入的参数
print('calling time : ', time.time())
if len(args) > :
fn(args[]) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
else:
fn()
return getTime @showTime
def function1(a):
print('running function1 ')
print('a = ', a) @showTime
def function2():
print('running function2 ') function1()
function2()
返回:
args is : (,)
calling time : 1567077936.79216
running function1
a =
args is : ()
calling time : 1567077936.792191
running function2
如果想要对传入的参数进行操作:
import time def showTime(fn):
def getTime(*args):#*args获得fn的参数
print('args is : ', args) #查看传入的参数
print('calling time : ', time.time())
if len(args) > :
n = args[]
n *=
fn(n) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
else:
fn()
return getTime @showTime
def function1(a):
print('running function1 ')
print('a = ', a) @showTime
def function2():
print('running function2 ') function1()
function2()
返回:
args is : (,)
calling time : 1567078015.031965
running function1
a =
args is : ()
calling time : 1567078015.0320058
running function2
2.如果是双重修饰符
1)简单版本,编译即实现
import time
def sayHello(fn):
print('Hello') def showTime(fn):
print('calling time : ', time.time())
fn() @sayHello
@showTime
def function1(a):
print('running function1 ')
print('a = ', a)
这个编译就会返回:
calling time : 1567078623.5239282
running function1
a =
Hello
2)调用才实现
如果想要以sayHello -> showTime -> function1的顺序,写法就要变为:
#coding:utf-8
import time def sayHello(fn):
def hello(*args):
print('Hello')
fn(*args) #
return hello # def showTime(fn):
def getTime(*args):# *args获得fn的参数
print('args is : ', args) #查看传入的参数
print('calling time : ', time.time())
if len(args) > :
n = args[]
n *=
fn(n) # 要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
else:
fn() return getTime # @sayHello
@showTime
def function1(a): #
print('running function1 ')
print('a = ', a) function1()
等于sayHello(showTime(function1(a))),所以调用function1(3)时运行的顺序为 :
- 先调用sayHello()返回的hello(3),此时传入的参数*args为(3,),然后调用hello中的fn(*args)
- 其实就是调用showTime()返回的getTime(3),此时传入的参数*args为(3,),然后调用getTime中的fn(n=6)
- 其实就是调用function1(6),就结束了
返回:
Hello
args is : (,)
calling time : 1567078847.98264
running function1
a =
python中的修饰符@的作用的更多相关文章
- Python 中的@修饰符作用
在Python 2.4以上的的函数中偶尔会看到函数定义的上一行有@functionName的修饰,这一下这个语法细节,其实这有点像C语言带参数的宏操作,解释器读到这样的修饰之后,会先解析@后的内容,直 ...
- python中的 @ 修饰符
今天学习廖老师的python教程,碰到了修饰符'@',不太了解,查看了下官方文档. 简单的整理下: @dec2 @dec1 def func(arg1, arg2, ...): pass 等价于 de ...
- C#中static修饰符的作用
static在C#中表示的是静态的,比如一个静态的字段是归类型所有,而非归对象所有,也就是说,在调用这个字段时,只能用类型去调,而不能用对象. 实例字段时随着对象创建而创建,对象销毁而销毁,而静态字段 ...
- scanf函数中*修饰符的作用,如:%*d
在scanf函数中,*修饰符可以跳过所在项的输入.如下: #include <stdio.h> int main() { ; printf("请输入:"); scanf ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- C/C++ 中 const 修饰符用法总结
C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...
- [原创] 基础中的基础(二):C/C++ 中 const 修饰符用法总结
在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家梳理一下知识,给大家一点点帮助.作者是菜鸟一 ...
- 转载----C/C++ 中 const 修饰符用法总结
感谢原创作者,写的好详细.不忍错过,所以转载过来了... 原文地址: https://www.cnblogs.com/icemoon1987/p/3320326.html 在这篇文章中,我总结了一些C ...
- Java中的 修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符 访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...
随机推荐
- 在linux上安装python
转自:https://www.cnblogs.com/qq631243523/p/10191726.html 一,前言 centos7默认是装有python的,咱们先看一下 [root@glh ~ 2 ...
- 小程序框架之视图层 View~事件系统~WXS响应事件
WXS响应事件 基础库 2.4.4 开始支持,低版本需做兼容处理. 背景 有频繁用户交互的效果在小程序上表现是比较卡顿的,例如页面有 2 个元素 A 和 B,用户在 A 上做 touchmove 手势 ...
- P1341 无序字母对[欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...
- mysql跨表删除多条记录
Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Product表和ProductPrice表.前者存在Product的基本信息, ...
- 用1 x 2的多米诺骨牌填满M x N矩形的方案数(完美覆盖)
题意 用 $1 \times 2$ 的多米诺骨牌填满 $M \times N$ 的矩形有多少种方案,$M \leq 5,N < 2^{31}$,输出答案模 $p$. 分析 当 $M=3$时,假设 ...
- 为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发:udp协议没有链接存在,udp直接丢数据,不管你有没有收到. TCP的可靠保证,是它的三次握手双向机制,这一 ...
- easyui-datagrid统计
<script> //打印指定的table function dayin() { var tableToPrint = document.getElementById("dg&q ...
- MySQL 数据库,主键为何不宜太长长长长长长长长?
回答星球水友提问:沈老师,我听网上说,MySQL数据表,在数据量比较大的情况下,主键不宜过长,是不是这样呢?这又是为什么呢? 这个问题嘛,不能一概而论: (1)如果是InnoDB存储引擎,主键不宜过长 ...
- noi.ac #43 dp计数
\(sol\) 状态 \[f_{i, dis_1, dis_2, dis_3, dis_4}\] 表示到了第 \(i\) 层,其中 \(dis_{1}\) 表示第一根柱子剩下的最靠上的横木到当前 \( ...
- 洛谷 P1147 连续自然数和 题解
P1147 连续自然数和 题目描述 对一个给定的自然数MM,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为MM. 例子:1998+1999+2000+2001+2002 = 100001 ...