虽然显式日志调用(或 warwaruk 建议的日志装饰器)是最直接的方法,但如果您愿意使用命名技巧,例如让逻辑foo
方法由Foo
. Python 是区分大小写的,所以它们是分开的和不同的。然后实现一个__getattr__
方法,如下所示:
class AutoLogger(object):
def __getattr__(self, attr):
try:
return self.__class__.__dict__[attr]
except KeyError:
func = self.__class__.__dict__[attr.capitalize()]
return lambda *args, **kwargs: self.log_call(attr, func, *args, **kwargs)
def log_call(self, func_name, func, *args, **kwargs):
func(self, *args, **kwargs)
print func_name, 'has been called (handled by', func_name.capitalize() + ')'
class BigAutoLoggerClass(AutoLogger):
def Foo(self):
print 'calling Foo'
b = BigAutoLoggerClass()
b.Foo()
print "---"
b.foo()
这产生:
calling Foo
---
calling Foo
foo has been called (handled by Foo)
bar
将类似地由 实现Bar
,依此类推。
如果您不喜欢这种随意的命名,也可以通过该sys.settrace()
功能自动进行日志记录。但是,这会增加很多运行时开销,并且实际上仅适用于调试或低(ish)性能还可以的情况。