解释Python装饰器如何工作
这个问题在这里已经有了答案:
装饰器是用于在Python中应用高阶函数的语法糖。 高阶函数是将一个或多个函数作为输入并返回函数的函数。 即
h(x) = f(g(x))
其中f()
是一个高阶函数,它接受单个参数g(x)
的函数,并返回单个参数h(x)
的函数。 你可以将f()
想象为修改g()
的行为。
高阶函数是可组合的(按定义),所以在你的具体例子中,装饰器语法,
@helloGalaxy
@helloSolarSystem
def hello(targetName=None):
...
相当于,
hello = helloGalaxy(helloSolarSystem(hello))
通过将hello
代入helloSolarSystem
,然后将结果代入helloGalaxy
,我们得到等效的函数调用,
def hello(targetName=None):
if targetName: |
print("Hello, " + targetName + "!") | (1) |
else: | | (2) |
print("Hello, world!") | | | (3)
print("Hello, solar system!") | |
print("Hello, galaxy!") |
(1)是原来的应用程序hello()
,(2)是应用程序,
def helloSolarSystem(original_function):
def new_function(*args, **kwargs):
original_function(*args, **kwargs) <-- (1)
print("Hello, solar system!")
return new_function
及(3)
def helloGalaxy(original_function):
def new_function(*args, **kwargs):
original_function(*args, **kwargs) <-- (2)
print("Hello, galaxy!")
return new_function
这只是一个观察,在Python中,函数是其他所有对象。 啊,包含变量的函数,你不是那么特别!
>>> issubclass(int, object) # all objects in Python inherit from a common baseclass
True
>>> def foo():
... pass
>>> foo.__class__ # 1
<type 'function'>
>>> issubclass(foo.__class__, object)
True
在你的例子中,@ helloGalaxy意味着hello = helloGalaxy(hello)
同样,@helloSolarSystem意味着hello = helloSolarSystem(hello)
当你打电话
@helloGalaxy
在hello()函数之前使用@helloSolarSystem
你好将由helloGalaxy和helloSolarSystem装饰
所以它的new_function()将被helloSolarSystem()覆盖。
在hello(“Earth”)之前,函数hello由helloSolarSystem()和helloGalaxy()装饰器的newFunction()装饰。
链接地址: http://www.djcxy.com/p/23807.html