• Wing·三金
    2019-06-17
    老师能否补充下,用 @functools.wraps(func) 来保留原来的元信息,有哪些现实意义呢?
     4
     32
  • 三水
    2019-06-17
    请教前辈们或老师一个初入门的问题:在本方前部"函数回顾"中,把函数赋给一个变量时,
    第1点:send_message = func
    第4点:send_message = func_closure()

    我尝试如下会报错:
    第1点:send_message = func()
    第4点:send_message = func_closure

    想知道这是哪一个知识点,谢谢
    展开

    作者回复: 第一点:
    直接赋值send_message = func()是错误的,因为func()必须接受一个参数,send_message = func('hello world')就正确了,他等同于send_message = func然后send_message('hello world')

    第4点:func_closure()是一个闭包,返回的是函数对象。不能直接用send_message = func_closure,然后send_message('hello world')调用,必须是send_message = func_closure(),然后再send_message('hello world'),这样才能把参数'hello world'正确传给内部函数

    
     19
  • 程序员人生
    2019-06-17
    我感觉python的装饰器的应用场景有点像AOP的应用场景,把一些常用的业务逻辑分离,提高程序可重用性,降低耦合度,提高开发效率。

    作者回复: 是的,你的理解很正确

    
     19
  • Hector
    2019-06-17
    lru cache常用来做一些小规模缓存,比如最近浏览记录,空间浏览记录等等,常用三种策略:1.FIFO(先进先出)2.最少使用LRU 3.最近最少使用LRU. 看了下源码,原来python原生的functools中的lru是链表写的
    
     8
  • farFlight
    2019-06-17
    请问一下,lru cache不是应该删除最久没有访问的内容吗。

    作者回复: LRU cache is to remove the least recently used data when the cache is full。翻译过来可能有点问题,意思就是删除最久没有访问的,我还是直接保留英文解释吧。

    
     6
  • 吴星
    2019-06-17
    请教下,为什么count那儿是单例模式吗?为什么二次执行会加1?

    作者回复: 因为num_calls这个变量是类变量,不是具体的实例变量,二次执行相当于调用了函数__call__两次,因此变量num_calls会变为2

     1
     5
  • 🇨🇳
    2019-06-17
    1、总结中,倒数第二行发现错别字(程序)不是程度。
    2、类装饰器在实际中有哪些应用场景呢

    作者回复: 欢迎指正错别字。类装饰器的用途和函数装饰器差不多,比如文中所讲的机器学习中需要对输入进行合理性检查,他也常常可以写成类装饰器的形式,进行调用。写成类的话,优点是程序的分解度更加高,具体用类装饰器和函数装饰器,视情况而定,二者本质是一样的

     1
     4
  • enjoylearning
    2019-06-17
    还有类装饰器,又长见识了,最近正愁参数校验放哪里,参照本文终于开窍了

    作者回复: 很高兴看到你有所收获

    
     4
  • 岁月婧好
    2019-07-08
    “原函数还是原函数吗?”一栏中“为了解决这个问题,我们通常使用内置的装饰器@functools.wrap“,应该是@functools.wraps,有s的吧
    
     3
  • 一叶知秋
    2019-06-18
    平时似乎也就property、staticmethod、classmethod用的比较多一点
    
     3
  • GentleCP
    2019-06-18
    老师,装饰器嵌套的时候,执行顺序不是decorator1->decorator2->func吗,应该是从外到内吧,外层的装饰器先执行,打印结果是
    decorator1
    decorator2
    hello world
     4
     3
  • 王圣军
    2019-12-17
    感觉装饰器类比java中的代理模式,AOP思想
    
     1
  • Leon📷
    2019-11-07
    我之前开发过微服务脚手架,跟装饰器模式很像,就是rpc调用之前,把限流,上报,统计耗时统计在前面,每个功能还可以自由选择执行的时机,跟业务功能分离,开发关注于业务研发就行了

    作者回复: 说的很好

    
     1
  • 被炸的油条
    2019-09-22
    工作当中,如果是二次开发,在原来的需求基础之上做优化,原逻辑不需要修改的情况下,只需增加新的业务场景的时候,感觉用装饰器挺好的。不动原来的逻辑,增加程序的健壮性。

    作者回复: 正解

    
     1
  • 江南皮革厂研发中心保...
    2019-07-30
    装饰器年年都在学,每次学都是新发现0_0 , 看来还是没到家
    
     1
  • A.Windy
    2019-07-11
    装饰器完全可以转换为方法调用:
    import functools
    def my_decorator(param):
        def inner(func):
            @functools.wraps(func) #保留函数的元信息
            def wrapper(*args, **kwargs):
                print("before func run. {}".format(param))
                func(*args, **kwargs)
                print("after func run. {}".format(param))
            return wrapper
        return inner
    @my_decorator("装饰器参数形式")
    def test(p, p1):
        print("i am func with param.{}, {}".format(p, p1))
    # 装饰器方式
    test("decorator", "p22")

    # 函数定义方式,等价于装饰器
    def test1(p, p1):
        print("i am func 函数调用 param.{}, {}".format(p, p1))
    f = my_decorator("函数参数形式")(test1)
    f("func call", "p2")
    #
    print(test, f)
    输出:
    before func run. 装饰器参数形式
    i am func with param.decorator, p22
    after func run. 装饰器参数形式
    before func run. 函数参数形式
    i am func 函数调用 param.func call, p2
    after func run. 函数参数形式
    <function my_decorator.<locals>.inner.<locals>.wrapper at 0x10a7107b8> <function my_decorator.<locals>.inner.<locals>.wrapper at 0x10a710bf8>
    展开
    
     1
  • magician
    2019-06-30
    api权限验证,缓存,日志,api运行时间
    
     1
  • 峥嵘
    2019-06-23
    请问老师,在“输入合理性检查“部分,为什么装饰器validation_check的参数不是func?
    谢谢老师

    def validation_check(input):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            ... # 检查输入是否合法
        
    @validation_check
    def neural_network_training(param1, param2, ...):
        ...
    展开
     1
     1
  • 吴
    2019-06-20
    不实用,代码可读性太低
    
     1
  • 木木杰
    2019-06-19
    没看懂啊,是我的问题吗?😂
     1
     1
我们在线,来聊聊吧