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

Kir*_*rov 3 python decorator python-3.x

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

def some_decorator( func ):
    # ..

class A:
    @some_decorator
    def func():
        pass
    @func.some_decorator    # this one here - func.some_decorator ?
    def func():
        pass
Run Code Online (Sandbox Code Playgroud)

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

PS我90%肯定,这里有这样的问题(因为这似乎是基本的东西),但我不知道如何搜索它.如果有完全重复,我会删除这个问题.


注意:两个成员函数都被命名,这不是错字,也不是偶然的func.装饰器用于重载:问题与装饰方法有关(类方法重载)

小智 7

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

def func():
    pass
func = some_decorator(func)
Run Code Online (Sandbox Code Playgroud)

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

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

    _decorator = func.some_decorator
    def func():
        pass
    func = _decorator(func)
Run Code Online (Sandbox Code Playgroud)