python – 如何调用它以及如何完成(`function_name.decorator`)?

真的很抱歉极其愚蠢的头衔,但如果我知道它是什么,我不会写在这里(:

def some_decorator( func ):
    # ..

class A:
    @some_decorator
    def func():
        pass
    @func.some_decorator    # this one here - func.some_decorator ?
    def func():
        pass

some_decorator装饰func – 没关系.但是什么是func.some_decorator以及some_decorator如何成为func的成员(或其他什么?)?

附:我90%肯定,这里有这样的问题(因为这看起来很基本),但我不知道如何搜索它.如果有完全重复,我会删除这个问题.

注意:两个成员函数都命名为func,这不是错字,也不是偶然的.装饰器用于重载:问题与Decorating method (class methods overloading)有关

解决方法:

请记住,使用装饰器的函数定义等效于:

def func():
    pass
func = some_decorator(func)

因此,在以下几行中,func不会引用您定义的函数,而是指装饰器将其转换为什么.还要注意,装饰器可以返回任何对象,而不仅仅是函数.因此,some_decorator返回一个带有方法的对象(不幸的是,some_decorator和func的名称在示例中被重用 – 这令人困惑,但不会改变任何有关概念的东西),它本身就是一个装饰器.当首先计算@之后的表达式时,在定义另一个普通函数func之后,仍然会引用第一个装饰器的方法.该装饰器适用于这个新功能.完整的例子就等同于:

class A:
    def func():
        pass
    func = some_decorator(func)

    _decorator = func.some_decorator
    def func():
        pass
    func = _decorator(func)
上一篇:python – decorator,用于在命名空间中生成新类


下一篇:类似Python的C装饰器