真的很抱歉极其愚蠢的头衔,但如果我知道它是什么,我不会写在这里(:
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)