Frage

Was ist eine saubere Art und Weise verschiedene Vorlagen zu verwenden, um auf einer Objektklasse abhängig? andere als buncha if-Anweisungen

War es hilfreich?

Lösung

Sie können eine dict machen, nennen es type2templ, mit Typen (das heißt, Klassen) als Schlüssel und mako.template.Template Instanzen als die Werte - dann

t = type2templ.get(type(theobj), default_templ)
... t.render() ...

Dies setzt voraus, dass theobj ist eine Instanz eines new-style Klasse (nicht die veralteten, am besten vermieden „Legacy“ Klassen, die nach wie vor der Standard in Python sind 2 - wenn Sie diejenigen verwenden, Sie sollten auf jeden Fall Ihr Code, um neue Stil-Klassen-Upgrade, aber theobj.__class__ verwendet, ist ein praktikables, wenn hackish, Ersatz für type(theobj) hier). default_templ ist eine Standardvorlage Instanz Verwendung für „keine der oben genannten“ (wenn Sie eher eine Ausnahme haben würden, wenn theobj eines nicht erkannte Typs ist, verwendet eckige Klammer Indizierung anstelle des .get Anrufs).

Beachten Sie, dass dies nicht (direkt) „Unterstützung Erbe“ - wenn (zum Beispiel) Klasse foo Karten in type2templ auf Vorlage bar, dann Sie eine Unterklasse baz von foo machen, aber nicht aufzeichnen explizit in type2templ was template seine Instanzen sollten, verwenden Sie die Standardvorlage für baz die Instanzen erhalten. Unterstützung von Vererbung ist komplexer - es sei denn, Sie nur den mako Vorlageninstanz einen der Klassenattribute machen, natürlich, die es trivial macht (nur theobj.thetempl, wenn Sie das Attribut thetempl nennen -!), Aber ich verstehe die Ansicht trennen von das Modell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top