这个python装饰器是如何工作的?

Pre*_*gha 2 python decorator

编辑/澄清使我的问题特定于我的查询:*我可以看到如何调用装饰器静态日志函数,但我没有看到如何调用_以及它的结果如何是日志的结果.我想看看进入/进入的东西是如何工作的*

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()
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

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

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

但是我不明白为什么___调用sub方法(并且它可以是任何名称).

unu*_*tbu 6

装饰者的基本事实是

@decorator
def func(): ...    
Run Code Online (Sandbox Code Playgroud)

完全等同于

def func(): ...
func=decorator(func)
Run Code Online (Sandbox Code Playgroud)

所以,

@logger.log
def first_x_method(self): ...
Run Code Online (Sandbox Code Playgroud)

是相同的

def first_x_method(self): ...
first_x_method=logger.log(first_x_method)
Run Code Online (Sandbox Code Playgroud)

因此logger.log使用参数调用静态方法func = first_x_method.

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

first_x_method=logger.log(first_x_method)因此设置first_x_method为指子方法__.

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

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

既然first_x_method引用__,它就__被调用了.