私が定義したとしましょう:
def to_class(cls):
""" returns a decorator
aimed to force the result to be of class cls. """
def decorating_func(func):
def wrapper(*args, **kwargs):
return cls(func(*args, **kwargs))
return wrapper
return decorator(decorating_func)
これを使用して、関数の結果を特定のクラスのオブジェクトに変換するデコレータを作成したいと思います。ただし、これは機能しません。
class TestClass(object):
def __init__(self, value):
self._value = (value, value)
def __str__(self):
return str(self._value)
@staticmethod
@to_test_class
def test_func(value):
return value
to_test_class = to_class(TestClass)
test_funcはto_test_classを検索しますが、見つかりません。一方、TestClassはまだ定義されていないため、クラス定義の前にto_test_classへの割り当てを配置しても失敗します。
@to_class(TestClass)をtest_funcの定義の上に配置しようとすると、メソッドがクラスの前に構築されるため(私が間違っていない場合)、失敗します。
私が見つけた唯一の回避策は、to_test_classをデコレータとして手動で定義することであり、一般的な「to_class」定義から返されるものとして定義することではありません。
これは基本的な例にすぎないことに注意してください。ただし、戻り値を「クラス」コンストラクターに「プラグイン」する前に変更するなど、多くのアプリケーションでto_classを使用したいと思います。他のクラスのメソッドのデコレータとしても使用したいと思います。
「to_class」デコレータは無意味だと考える人もいると思います。代わりに、装飾されたメソッド内で操作を行うことができます。とはいえ、便利で読みやすさにも役立ちます。
最後に、これは実用的な理由で20%、勉強の理由で80%興味があることを付け加えたいと思います。これは、Pythonのデコレータ全般について完全には理解していないことです。