这个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
指的__
是__
被调用。