我想出了以下代码来使用需要实例本身作为参数的装饰器来装饰实例方法:
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()
这似乎很有效,但我担心我可能忽略了这个技巧的一些意想不到的副作用。我会搬起石头砸自己的脚吗?这样安全吗?
请注意,我实际上并不想将其用于日志记录,这只是我能想到的最短的有意义的示例。
最佳答案
我不太清楚您为什么要这样做。如果要动态分配新方法类型,请使用 types
:
import types
class Tricky(object):
def __init__(self):
def method(self):
print('Hello')
self.method = types.MethodType(method, self)
如果你想对实例做些什么,在__init__
方法中做。如果您只想访问装饰器内的方法实例,您可以使用 im_self
属性:
def decorator(tricky_instance):
def wrapper(meth):
print(meth.im_self == tricky_instance)
return meth
return wrapper
就我个人而言,我认为这正在转向也许我不应该使用装饰器领域。
关于oop - Python:将实例方法动态分配为实例属性有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101126/