私はテストフレームワークの開発に取り組んできました (Selenium やその他のツールセットの上に、特に関連性はありませんが)、フレームワークを簡単に拡張できると判断したコンポーネントの 1 つは、簡単に追加できる方法です。自動メモ化するクラス メンバー (たとえば、ページ オブジェクト内のページから抽出されるデータ要素)。私が思いついた解決策は、__getattr__()
自動メモ化が必要なすべてのクラスの親クラスとして使用できるオーバーライドするクラスでした。このクラスのコードは次のとおりです。
class SelfCachingGetters(object):
def __getattr__(self, name):
getter_string = '_get_%s' % name
try:
value = getattr(self, getter_string)()
setattr(self, name, value)
except AttributeError:
raise AttributeError('%s is not a member of this class.' % name)
return value
このクラスにより、任意のサブクラスで自動メモ化メンバーを作成するために必要なことは_get_XXXX()
、XXXX がクラス メンバーに持たせたい名前であるメソッドを宣言することだけです。私がこれを気に入っているのは、この機能を実装するためのシンプルでクリーンな方法になるからです。たとえば、各ページ オブジェクトにデコレータを使用する多数のメソッドを用意する必要はありません。
私の質問は、これがこの動作を実装するための最良の (最も Pythonic な) 方法ですか? それについての何かは、私には非常に非OOのようです。私はメタクラスとクラスデコレータを調べていました。他に提案はありますか?