私はこの問題の解決方法をウェブで検索してきましたが、エレガントなものは何も見つかりませんでした。pythonデコレータ - ベース内にクラスを登録する
from abc import ABCMeta
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, name):
self._name = name
self._content = {}
def run_them_all(self):
for key, content in self._content.items():
print(key, content)
# This should be the registery function
def register(old_method, key):
self._content[key] = old_method()
class Derived(Base):
@Base.register("some other content")
def do_something(self):
return {"name": "yes"}
@Base.register("some_content")
def do_something_else(self):
return {"hi": "ho"}
def this_should_not_be_registered(self):
return "yooo"
derived = Derived("John")
derived.run_them_all()
がこれをachievすることが可能です:
は、私は、派生クラスがそのメソッドを登録するためにデコレータとして使用することができますレジストリを持つ基本クラスを考えてみましょうか? 通常のデコレータを使用すると、迂回路を作成するために明示的な関数呼び出しが必要になります。しかし、私はこの呼び出しを後で使用するために登録するか、または少なくともそれらのメソッドを自分で呼び出すことなく、後で使用する戻り値を登録するだけです。私は単純に、このようrun_them_allをオーバーライド避けたい
{"some other content": {"name": "yes"}}
{"some content": {"hi": "ho"}}
:
class Derived(Base):
...
def run_them_all(self):
self._content["some_content"] = self.do_something_else()
...
return self._content
あなたの説明がほとんど意味をなさない問題を明確にして、これを処理するためにデコレータクラスの代わりにデコレータ関数を使用することができない理由は何もありません。また、実際にここに何かを飾ることはありません。 – snb
@snb私は仕事の装飾機能を書いていませんでした。しかし、例を見ると、関数を自分で呼び出すことなく、自分の結果を単なるdictの中に保存する自己認識デコレータを作成したいと思うのは簡単です。 1つの解決策は反射を使用することですが、私は人々がより良い方法を知っているかどうかを知りたいと思います。 – Crippin
いいえ「機能を呼び出すことなく、結果をディクテーション内に保存するための自己認識デコレータを作成する」ことを理解していないと簡単に理解できません。また、あなたが何かを装飾していないと言ったとき、あなたの構文のどれも実際に装飾を意味するものではないことを意味しました。あなたの例では何も変更せずに関数を返さないというJBernardoの答えを見てください。 krzysztofzuraw.com/blog/2016/python-class-decorators.html – snb