Python 如何使用实例方法作为装饰器?

Python 如何使用实例方法作为装饰器?,python,python-3.x,Python,Python 3.x,下面的代码如何工作,而不将函数(func)传递给对象方法task() 例如,将其与以下内容进行比较。向给定函数添加附加功能。在上面的示例中,我无法理解func是如何传递给task()方法的 在这里: @pipeline.task() def第一个_任务(x): 返回x+1 pipeline.task()调用pipeline的task方法。这将返回函数内部 @表示此函数(内部)将用作装饰器。因此调用internal,随后的函数定义def first\u task…作为其参数func传递 inte

下面的代码如何工作,而不将函数(func)传递给对象方法task()

例如,将其与以下内容进行比较。向给定函数添加附加功能。在上面的示例中,我无法理解func是如何传递给task()方法的

在这里:

@pipeline.task()
def第一个_任务(x):
返回x+1
pipeline.task()
调用
pipeline
task
方法。这将返回函数
内部

@
表示此函数(
内部
)将用作装饰器。因此调用
internal
,随后的函数定义
def first\u task…
作为其参数
func
传递

internal
将函数
func
添加到管道的任务列表中

你可以这样读:

internal=pipeline.task()
#inner是由pipeline.task()创建的函数
#将函数添加到管道的任务列表
@内在的
def第一个_任务(x):
返回x+1
而decorator语法使其行为类似于:

internal=pipeline.task()
def第一个_任务(x):
返回x+1
第一个任务=内部(第一个任务)

您正在传递一个函数。使用
def first_task(x)
定义的函数是作为
func
传递的函数。这就是装饰师所做的。为什么下面给出了错误?self:pipeline那么第一个任务如何作为函数传递,而不作为参数传递给任务方法<代码>定义任务(自身、功能):
class Pipeline:
    def __init__(self):
        self.tasks = list()
        
    def task(self):
        def inner(func):
            self.tasks.append(func)
            return func
        return inner

pipeline = Pipeline()
    
@pipeline.task()
def first_task(x):
    return x + 1

print(pipeline.tasks)
def logger(func):
    def inner(*args):
        print('Calling function: {}'.format(func.__name__))
        print('With args: {}'.format(args))
        return func(*args)
    return inner

@logger
def add(a, b):
    return a + b