'''

预备知识:

……

@decorator

def f(*args,**kwargs):

pass

# 此处@decorator  等价于 f = decorator(f)

@decorator2(*args,**kwargs)

def f2(*args,**kwargs):

pass

# 此处@decorator2(*args,**kwargs)  等价于: 第一步,执行函数decorator2(*args,**kwargs),获得中间结果temp;  第二步,执行装饰器函数(即@temp)

'''

import functools,time

def log(*args,**kwargs):

def metric(fn):

@functools.wraps(fn)

def t(*args,**kwargs):  #计算函数执行消耗的时间

t0 = time.time()

result = fn(*args, **kwargs)

t1 = time.time()

print('%s executed in %s ms' % (fn.__name__, t1 - t0))

return result

return t

for i in args:

if type(i).__name__ == 'function':    #判断传入的参数是函数名称(即log后面没有带参数)

return metric(i)   #返回并执行装饰器函数metric(),相当于log是metric的别名。

else:  # log后面带普通参数的情形

print(i)   # 理论上,log后面可传入无限个参数,如何使用应结合具体情形,本例仅遍历打印,且参数中不包含‘function’类型。

return metric  # log后面带普通参数,说明log()是个普通函数,执行log()后,返回装饰器函数的名字metric,再执行metric().

# 测试

@log("execute")

def fast(x, y):

time.sleep(0.0012)

return x + y

@log

def slow(x, y, z):

time.sleep(0.1234)

return x * y * z

f = fast(11, 22)

s = slow(11, 22, 33)

if f != 33:

print('测试失败!')

elif s != 7986:

print('测试失败!')

python装饰器同时支持有参数和无参数的练习题的更多相关文章

  1. python 装饰器 第六步:带有收集参数的函数的装饰器

    #第六步:带有收集参数的函数的装饰器 #装饰器函数 def kuozhan(func): #内部函数(扩展之后的eat函数) def neweat(*w,**n): #以下三步就是扩展之后的功能,于是 ...

  2. python装饰器总结

    一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数的函数 ...

  3. 个人关于python装饰器的白痴理解

    无参数装饰器 对于python小白来说,python的装饰器简直让人懵逼,不知如何理解,其实按照装饰器的字面意思, 就是把自己定义的函数装饰一遍,然后返回一个新的函数(注意是新的,已经不是本来定义的函 ...

  4. 一个关于python装饰器参数的问题

    看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. Python装饰器探究——装饰器参数

    Table of Contents 1. 探究装饰器参数 1.1. 编写传参的装饰器 1.2. 理解传参的装饰器 1.3. 传参和不传参的兼容 2. 参考资料 探究装饰器参数 编写传参的装饰器 通常我 ...

  7. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  8. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  9. python -- 装饰器的高级应用

    装饰器和装饰器模式装饰器模式是面向对象的一种设计模式,支持将行为动态增加到已经存在的对象上.当装饰一个对象的时候,就表示独立与其他类实例对象,为该对象扩展了新的功能. python的装饰器不是装饰器模 ...

随机推荐

  1. flask 需要下载的包

    Flask 需要下载的包1.pip install flask2.pip install flask-script3.pip install flask-sqlalchemy4.pip install ...

  2. 使用autohotkey修改方向键、回车和启动程序

    具体步骤 下载并安装autohotkey. 在你觉得合适的地方鼠标右键-新建-autohotkey script(脚本):或者创建一个别的文件,再把后缀改成ahk也可以 一个新建的ahk文档里面会有这 ...

  3. SQLServer “无法对数据库'XXX' 执行删除,因为它正用于复制”的解决方法

    “无法对数据库'XXX'执行删除,因为它正用于复制” 解决办法: 执行  sp_removedbreplication 'XXX'  这个语句的解释是:从数据库中删除所有复制对象,但不更新分发服务器上 ...

  4. Populate screen data automatically

    field zz_test-uname. module populate_record on chain-request. module populate_record input. ztlo_tes ...

  5. xp密钥-资源分享

    xp-密钥:QC986-27D34-6M3TY-JJXP9-TBGMD ftp-资源地址: ftp://10.10.31.2/?tdsourcetag=s_pctim_aiomsg

  6. HYSBZ 2743 (树状数组) 采花

    题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...

  7. Movavi Video Editor 15 Plus Mac怎样更改视频的分辨率?

    使用Movavi Video Editor 15您可以对视频进行切割和修剪,裁剪和旋转,色度键,视频稳定以及画中画等很多的编辑,该软件操作简单,就算是新手也无需担心操作问题,本文讲述了Movavi V ...

  8. pd16.5增加字段备注

    EXEC sp_addextendedproperty 'MS_Description', %.q:COLNNAME%, 'user', dbo, 'table', %TABLE%, 'column' ...

  9. net::ERR_CONNECTION_RESET 问题排查

    后台服务器代码有问题 实体不对称,导致映射不对

  10. Vue+Webpack构建移动端京东金融(一、开发前准备)

    一.开发前准备 1.node环境搭建 去node.js官网下载长期支持版本的node,采用全局安装,安装方式自行百度 网址:https://nodejs.org/zh-cn/ 安装后在cmd命令行运行 ...