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?
Répondre
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.
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? –
je vais le faire, je réalise juste ce que je pourrais faire mal – Timmy