Pythonで関連するメソッドデコレータのファミリを作成する方法を理解するように教えられたので、良いpythonであり、oopの原則と一致する方法を考えるのに苦労しています。
相互に矛盾する目標は、装飾されたメソッドがバインドされているインスタンスのデコレータ属性と属性の両方にアクセスできるようにすることです。これが私が意味することです:
from functools import wraps
class AbstractDecorator(object):
"""
This seems like the more natural way, but won't work
because the instance to which the wrapped function
is attached will never be in scope.
"""
def __new__(cls,f,*args,**kwargs):
return wraps(f)(object.__new__(cls,*args,**kwargs))
def __init__(decorator_self, f):
decorator_self.f = f
decorator_self.punctuation = "..."
def __call__(decorator_self, *args, **kwargs):
decorator_self.very_important_prep()
return decorator_self.f(decorator_self, *args, **kwargs)
class SillyDecorator(AbstractDecorator):
def very_important_prep(decorator_self):
print "My apartment was infested with koalas%s"%(decorator_self.punctuation)
class UsefulObject(object):
def __init__(useful_object_self, noun):
useful_object_self.noun = noun
@SillyDecorator
def red(useful_object_self):
print "red %s"%(useful_object_self.noun)
if __name__ == "__main__":
u = UsefulObject("balloons")
u.red()
もちろん、これは生成します
My apartment was infested with koalas...
AttributeError: 'SillyDecorator' object has no attribute 'noun'
もちろん、これを機能させる方法は常にあることに注意してください。たとえば、十分な引数を持つファクトリを使用すると、SillyDecorator の作成されたインスタンスにメソッドをアタッチできますが、継承を使用してこれを行う合理的な方法があるかどうか疑問に思っていました。