首页 > 解决方案 > python中等值函数的机制

问题描述

我了解到我们可以像这样在 Python 中将一个函数与另一个函数等同起来:

def func_1(x)
    print("func_1")
    print(x)

def func_2(x)
    print("func_2")
    print(x)

func_1 =func_2

所以这里发生的是每次调用 func_1 都会执行 func_2。

但是,我阅读了有关装饰器的信息,以下是说明它们的简单代码:

def our_decorator(func):
    def function_wrapper(x):
        print("Before calling " + func.__name__)
        func(x)
        print("After calling " + func.__name__)
    return function_wrapper

def foo(x):
    print("Hi, foo has been called with " + str(x))

print("We call foo before decoration:")
foo("Hi")

print("We now decorate foo with f:")
foo = our_decorator(foo)

print("We call foo after decoration:")
foo(42)

正如我们在以下行中看到的:

foo = our_decorator(foo)

类似于前面的函数方程的事情正在发生。我认为这就是装饰器的工作方式,即通过调用 decorator 替换对被装饰者的调用。

但是,在这种印象下,如果我编写如下代码:

def our_decorator():
    def function_wrapper(x):
        print("Before calling " )
        foo(x)
        print("After calling " )
    return function_wrapper

def foo(x):
    print("Hi, foo has been called with " + str(x))

print("We call foo before decoration:")
foo("Hi")

print("We now decorate foo with f:")
foo = our_decorator()

print("We call foo after decoration:")
foo(42)

以上导致无限递归打印无限数量的“调用之前”。

因此,我可以得出结论,装饰器必须是以函数为参数的东西。

所以这两个cae中函数的等价是不同的,即用另一个函数作为参数的函数等价,以及不把另一个函数作为参数的两个函数等价。

这两者在内部实现方面有何不同?

标签: pythondecorator

解决方案


你所说的“等值函数”实际上只是一个变量赋值。函数定义(带def)创建一个函数并将其分配给一个变量名。完成后func_1 = func_2,您有 2 个变量引用同一个函数。

在您的装饰器示例中发生的事情是上一段的自然结果。如果您需要进一步澄清,请发表评论。


推荐阅读