オブジェクトクラスに応じて異なるテンプレートを使用するためのクリーンな方法は何ですか?bunchaifステートメント以外
1 に答える
タイプ(つまり、クラス)をキーとして、インスタンスを値として、を作成してdict
呼び出すことができます。type2templ
mako.template.Template
t = type2templ.get(type(theobj), default_templ)
... t.render() ...
これは、それが新しいスタイルのtheobj
クラスのインスタンスであることを前提としています(Python 2のデフォルトである、廃止された、最も回避された「レガシー」クラスではありません。これらを使用する場合は、コードを新しいスタイルのクラスに確実にアップグレードする必要があります。 、しかし、ハックの場合は、ここの代わりに使用することは実行可能です)。 は、「上記のいずれでもない」に使用するデフォルトのテンプレートインスタンスです(が認識されないタイプの場合に例外が発生する場合は、呼び出しの代わりに角括弧のインデックスを使用してください)。theobj.__class__
type(theobj)
default_templ
theobj
.get
これは(直接)「継承をサポート」しないことに注意してください。たとえば、クラスがテンプレートにfoo
マップされる場合、サブクラスを作成しますが、インスタンスが使用するテンプレートを明示的に記録しないと、次のようになります。のインスタンスのデフォルトテンプレート。継承のサポートはもっと複雑です-もちろん、makoテンプレートインスタンスをクラス属性の1つにしない限り、それは簡単になります(その属性に名前を付けた場合でも!-)が、ビューをモデルから分離することは理解しています。type2templ
bar
baz
foo
type2templ
baz
theobj.thetempl
thetempl