资讯专栏INFORMATION COLUMN

小李飞刀:python请与我一起愉快的玩耍吧!

FuisonDesign / 550人阅读

摘要:属性,可以函数的名字在代码运行期间动态增加功能的方式,称之为装饰器。本质上,就是一个返回函数的高阶函数。比如,定义一个能打印日志的。接受函数作为参数,要放置在函数定义处。一个完整的的代码如下记录的是传入的的值,位置在嵌套内或者带参数的如下。

又是一段叨叨

如果总是担心能不能做到的话,那就干脆不要做了。
想做的事情还是一往无前的好,什么都不想,就努力冲冲冲吧!

装饰器

因为函数是一个对象。
所以。

__name__属性,可以get函数的名字.

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

本质上,decorator就是一个返回函数的高阶函数。

比如,定义一个能打印日志的decorator。

def log(func):
    def wrapper(*args, **kw):
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper

log接受函数作为参数,要放置在函数定义处。

@log
def now():
    print("2015-3-25")

这样调用now()的时候,就会先打印出程序名称。
@log放到now()函数的定义处,相当于执行了语句

now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。【此时的now已经不是原来的now了,只是个同名的朋友】

当需要再进一步的时候,比如decorator本身需要传入参数,就需要再改造下函数。

这个三层嵌套的效果如下:

now = log("execute")(now)

但是也存在问题,因为函数的名字now.__name__此时已经变成了wrapper,所以需要把原始函数的名称等属性复制到wrapper()中,否则一些依赖于函数签名的代码执行就会出错。

Python内置的functools.wraps就可以用来处理这个问题。
一个完整的decorator的代码如下:

import functools

def log(func):
    @functools.wraps(func)  #记录的是传入的func的值,位置在嵌套内
    def wrapper(*args, **kw):
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper

或者带参数的如下。

import functools

def log(text):
    def decorator(func):
        @functools.wraps(func) #记录的是传入的func的值,位置在嵌套内
        def wrapper(*args, **kw):
            print("%s %s():" % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@functools.wraps(func)加上这句很重要

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42900.html

相关文章

  • 小李飞刀python我来做题啦

    摘要:好久不见最近都在忙年底的年会,还沉迷于学习统计学,教程还停留在基础语法。做题做题无论如何,数据结构还是很重要的,所以准备每天刷的题目啦。第一题移除元素给定一个数组和一个值,你需要原地移除所有数值等于的元素,返回移除后数组的新长度。 好久不见 最近都在忙年底的年会,还沉迷于学习统计学,python教程还停留在基础语法。但是仔细规划了下,还是要好好的瞄准目标前行。所以准备呢,实战走起来。 ...

    nevermind 评论0 收藏0
  • 小李飞刀:磨刀霍霍继续向python

    摘要:例如做累加,函数生成整数序列,函数转换成。因为不能重复,所以中没有重复的。创建,需要提供一个作为输入合集。重复元素在中自动被过滤。添加元素,重复添加无效果删除元素 写在前面的一点罗里吧嗦小唠叨昨晚的python看到了快12点吧,然后进度相对来说还算满意,只能说一点点推进,庆幸自己的大学还是一个比较认真的小码农,现在捡起来还算比较得心应手(pia飞自己,算法什么的还没到好吗!)好好学习呗...

    txgcwm 评论0 收藏0
  • 小李飞刀:ppppppython是需要好好学习

    摘要:直接抄其中一份的结论吧各地区招聘公司数量和平均待遇。可以看出不论是招聘公司的数据还是平均待遇水平主要都是北上广深杭州占优势。但事实证明,总是要有一些代价的。要学会看报错信息。函数定义结束后需要按两次回车重新回到提示符下。 又是写在前面的乱七八糟 持续学习的第三天了,持续学习是一个不容易培养的好习惯,但是坚持就是胜利嘛~昨天因为一点点事情,所以没能学习很长时间,今天要补回来。周末要搬家,...

    Simon 评论0 收藏0
  • 小李飞刀python你慢点飞,我脑子还在后面追

    摘要:默认参数设置默认参数时,有几点要注意一是必选参数在前,默认参数在后,否则的解释器会报错二是如何设置默认参数。注意此处,获得的其实是的拷贝,函数内对的改变不会影响到。使用递归函数需要注意防止栈溢出。 总是在最前面的叨逼叨 最近总是在想成长这两个很常常被提起的事情,这对于一个已经25岁的半中年而言,已经是一个不太能高频提起的词。但是,最近一些事情吧,总让我觉得我的生长期似乎比正常人来的晚了...

    kevin 评论0 收藏0
  • 小李飞刀python请你轻轻轻点虐

    摘要:迭代器可以直接作用于循环的对象统称为可迭代对象。可以被函数调用并不断返回下一个值的对象称为迭代器。这个高阶函数,关键在于正确实现一个筛选函数。 又是日常唠嗑的一小段 真的是非常话唠的在下,日常给自己打点鸡血吧。昨晚和老妈聊了一整晚,所以昨天并没有更新。然后因为很快要开始算个税减免的部分,对于温饱线的在下而言,其实减免的可能就只是奶茶钱吧。工作的本质是赚钱,我也很想在30岁之前完成财务自...

    Keagan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<