python - 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中函数的等价是不同的,即用另一个函数作为参数的函数等价,以及不把另一个函数作为参数的两个函数等价。
这两者在内部实现方面有何不同?
解决方案
你所说的“等值函数”实际上只是一个变量赋值。函数定义(带def
)创建一个函数并将其分配给一个变量名。完成后func_1 = func_2
,您有 2 个变量引用同一个函数。
在您的装饰器示例中发生的事情是上一段的自然结果。如果您需要进一步澄清,请发表评论。
推荐阅读
- python - map() 函数可以与内置函数一起使用吗?
- c# - 如何将不同格式的日期保存到 SQL Server
- c# - 令牌无法存储在 .NET Core 中
- python - 如何正确实施 scipy.integrate.Radau?
- hbase - 如何在 Apache phoenix 的字符串中识别/搜索“-”?
- javascript - 从谷歌图书 api 中分离元素
- python - 针对客户端应用程序在 python Web api 上的 Azure 广告访问令牌验证
- android - 使用uri加载本地大图时,速度很慢。我该如何优化它?
- python-3.x - TypeError:'str'对象不支持项目分配google api
- r - 当变量等于 0 时擦除行但当它是 NA 时不擦除行,或者当 R 中的两列等于 NA 时