Я узнал, что мы можем приравнять одну функцию к другой в 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)
происходит нечто подобное предыдущему уравнению функции.Я подумал, что именно так могут работать декораторы, т. Е. Заменять вызов декоратора вызовом декоратора.
Однако, под этим впечатлением, если я напишу код, подобный следующему:
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)
Приведенное выше приведёт к бесконечной рекурсии, печатающей бесконечное число «Перед вызовом».
Итак, я могу заключить, что декоратор должен быть чем-то, что принимает функцию в качестве аргумента.
Таким образом, приравнивание функций различается в этих двух случаях, а именно приравнивается к функции, которая принимает в качестве аргумента другую функцию, иприравнивая две функции, которые не принимают другую функцию в качестве аргумента.
Как эти два могут отличаться во внутренней реализации?