Вы можете сделать 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
отображается в type2templ
на шаблон bar
, то вы создаете подкласс baz
из foo
но не записывайте явно в type2templ
, какой шаблон должны использовать его экземпляры, вы получите шаблон по умолчанию для экземпляров baz
. Поддержка наследования является более сложной - если только вы не сделаете экземпляр шаблона mako одним из атрибутов класса, конечно, что делает его тривиальным (просто theobj.thetempl
, если вы называете этот атрибут thetempl
! -), но я понимаю, что отделить вид от модели.