python装饰器同时支持有参数和无参数的练习题

‘‘‘

预备知识:

……

@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(‘测试失败!‘)

原文地址:https://www.cnblogs.com/sqs-cn/p/10697803.html

时间: 2024-10-09 08:39:55

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

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

无参数装饰器 对于python小白来说,python的装饰器简直让人懵逼,不知如何理解,其实按照装饰器的字面意思, 就是把自己定义的函数装饰一遍,然后返回一个新的函数(注意是新的,已经不是本来定义的函数了) 为什么这么说,我用一个装饰器最原始的例子来说明,看一下代码: 1 #装饰函数 2 def decorator(foo): 3 def wrapper(): 4 print 'wrapper' 5 return foo() 6 return wrapper 7 8 #自定义函数 9 def a

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

python装饰器总结

一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.简单的说装饰器就是一个用来返回函数的函数. 它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 二.为什么需要装饰器 1.先来看一个简单例子

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

看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000 在最后的作业题上 再思考一下能否写出一个@log的decorator,使它既支持: @log def f(): pass 又支持: @log('execute') def f(

python 装饰器 一 (简单不带参数的函数)

#coding=utf-8 #python 装饰器 '''     装饰器可以用def的形式来定义.装饰器接收一个可调用对象作为输入参数, 并返回一个新的可调用对象. 装饰器新建了一个可调用对象,也就是return 返回的函数funx, 在新增的函数中,可以添加我们需要的功能,并通过调用原有函数来实现原有函数的功能 ''' def deco(func):     '''         无参数装饰器,func为被装饰的函数     '''     def _deco():         pri

python进阶之装饰器之2.定义一个可接受参数的装饰器、如何定义一个属性可由用户修改的装饰器、定义一个能接受可选参数的装饰器

2.1.定义一个接受参数的装饰器 前言:在理解上一篇文章的基础上理解定义一个接受参数的装饰器 思路:在装饰器函数的外层再定义一个接受参数的函数,让他返回装饰器函数,在装饰器函数中进行相关参数的进行操作 代码解析如下: from functools import wrapsimport logging# 定义外层函数logged,使用return decorate返回装饰器函数def logged(level, name=None, message=None): """ Add

12步轻松搞定python装饰器

12步轻松搞定python装饰器 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数相关语法的一些特点. 我没法让装饰器变得简单,但是通过一步步的剖析,我也许能够让你在理解装饰器的时候更自信一点.因为装饰器很复杂,这篇文章将会很长(自己都说很长,还敢这么多废话blablabla...前戏就不继续翻译直接省略了) 1. 函数 在python中,函数通

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考

最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方.因此在此以一个初学者的认知记录一下python的装饰器的学习心得. 1. 什么是装饰器? 顾名思义,装饰器就是在方法上方标一个带有@符号的方法名,以此来对被装饰的方法进行点缀改造. 当你明白什么是装饰器之后,自然会觉得这