编辑/澄清使我的问题特定于我的查询:*我可以看到如何调用装饰器静态日志函数,但我没有看到如何调用_以及它的结果如何是日志的结果.我想看看进入/进入的东西是如何工作的*
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方法(并且它可以是任何名称).
装饰者的基本事实是
@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引用__,它就__被调用了.
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |