解释Python装饰器如何工作

这个问题在这里已经有了答案:

  • 如何创建一个函数装饰器链? 15个答案

  • 装饰器是用于在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

    上一篇: Explain how Python decorator works

    下一篇: "@" Decorator (in Python)