2010-04-21 8 views
0

Qu'est-ce qu'un moyen propre d'utiliser différents modèles en fonction d'une classe d'objet? autre que buncha si les déclarationsModèle Mako en fonction de la classe d'objet?

+2

Lorsque vous travaillez en Python, faire des choses différentes en fonction du type d'objet est presque toujours un défaut de conception. Peut-être devriez-vous pré-traiter vos données afin que le modèle puisse y accéder facilement? –

+0

je vais le faire, je réalise juste ce que je pourrais faire mal – Timmy

Répondre

2

Vous pouvez faire un dict, appelez type2templ, avec des types (c.-à-classes) comme les clés, et mako.template.Template instances comme les valeurs - puis

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

Cela suppose que theobj est une instance d'une classe nouveau-style (pas les classes "héritées" obsolètes, mieux évitées qui sont toujours les classes par défaut dans Python 2 - si vous les utilisez, vous devez définitivement mettre à niveau votre code vers new-style classes, mais en utilisant theobj.__class__ est un travail, si hackish, replacemen t pour type(theobj) ici). default_templ est une instance de modèle par défaut à utiliser pour "aucun des éléments ci-dessus" (si vous préférez avoir une exception lorsque theobj est d'un type non reconnu, utilisez l'indexation de crochet au lieu de l'appel .get).

Notez que cela ne (directement) « l'héritage de soutien » - si (par exemple) classe foo cartes en type2templ à modèle bar, alors vous faire une sous-classe baz de foo mais n'enregistrent pas explicitement dans ce type2templ modèle que ses instances doivent utiliser, vous obtiendrez le modèle par défaut pour les instances de baz. La prise en charge de l'héritage est plus complexe - à moins que vous ne fassiez simplement de l'instance de modèle mako l'un des attributs de la classe, ce qui le rend trivial (theobj.thetempl si vous nommez cet attribut thetempl! -), mais je comprends pour séparer la vue de le modèle.

Questions connexes