我想出了以下代码来使用装饰器来装饰实例方法,该装饰器需要将实例本身作为参数:
from functools import wraps
def logging_decorator(tricky_instance):
def wrapper(fn):
@wraps(fn)
def wrapped(*a, **kw):
if tricky_instance.log:
print("Calling %s.." % fn.__name__)
return fn(*a, **kw)
return wrapped
return wrapper
class Tricky(object):
def __init__(self, log):
self.log = log
self.say_hi = logging_decorator(self)(self.say_hi)
def say_hi(self):
print("Hello, world!")
i1 = Tricky(log=True)
i2 = Tricky(log=False)
i1.say_hi()
i2.say_hi()
Run Code Online (Sandbox Code Playgroud)
这似乎很有效,但我担心我可能忽略了这个技巧的一些无意识的副作用.我是要在脚下拍自己,还是这样安全?
请注意,我实际上并不想将其用于日志记录,这只是我能想到的最有意义的例子.
我想我是在试图变得不必要的聪明。似乎有一个更简单的解决方案:
from functools import wraps
def logging_decorator(fn):
@wraps(fn)
def wrapped(self, *a, **kw):
if self.log:
print("Calling %s.." % fn.__name__)
return fn(self, *a, **kw)
return wrapped
class Tricky(object):
def __init__(self, log):
self.log = log
@logging_decorator
def say_hi(self):
print("Hello, world!")
i1 = Tricky(log=True)
i2 = Tricky(log=False)
i1.say_hi()
i2.say_hi()
Run Code Online (Sandbox Code Playgroud)