这个python装饰器如何工作?


问题内容

编辑/说明以使我的问题特定于我的查询我可以看到装饰器静态日志函数的调用方式,但看不到 ___
的调用方式以及它的结果是log的结果。我可以查看输入/输入内容的工作方式

class logger:
    @staticmethod
    def log(func):
        def ___(*args, **kwargs):
            try:
                print "Entering: [%s] with parameters %s" % (func.__name__, args)
                try:
                    return func(*args, **kwargs)
                except Exception, e:
                    print 'Exception in %s : %s' % (func.__name__, e)
            finally:
                print "Exiting: [%s]" % func.__name__
        return ___


class x:
      @logger.log
      def first_x_method(self):
          print 'doing first_x_method stuff...'

x().first_x_method()

给出以下输出:

Entering: [first_x_method] with parameters (<__main__.x instance at 0x0000000001F45648>,)
doing first_x_method stuff...
Exiting: [first_x_method]

我可以看到logger是一个带有静态方法的类,该类用于装饰(@logger.log)first_x_method。

但是我不明白为什么___调用子方法(它可以是任何名称)。


问题答案:

关于装饰器的基本事实是

@decorator
def func(): ...

完全等同于

def func(): ...
func=decorator(func)

所以,

@logger.log
def first_x_method(self): ...

是相同的

def first_x_method(self): ...
first_x_method=logger.log(first_x_method)

因此,logger.log静态方法用arguments调用func = first_x_method

在调用中logger.log(first_x_method),子方法__已定义并返回。

first_x_method=logger.log(first_x_method)因此设置first_x_method为引用sub方法__

中的括号first_x_method()告诉Python调用该方法first_x_method

因此,x().first_x_method()首先实例化类x的实例,然后调用方法first_x_method(提供的x()作为第一个参数)。

既然first_x_method指的____被调用。