2010-04-21 2 views
0

Какой чистый способ использовать разные шаблоны в зависимости от класса объекта? кроме Buncha если заявленияMako шаблон в зависимости от класса объекта?

+2

При работе в Python выполнение разных вещей, основанных на типе объекта, почти всегда является недостатком дизайна. Возможно, вам следует предварительно обработать ваши данные, чтобы шаблон мог получить к нему доступ прямолинейно? –

+0

Я сделаю это, я просто понимаю, что я могу делать неправильно – Timmy

ответ

2

Вы можете сделать dict, назовем его type2templ, с типами (т.е. классы) в качестве ключей, и mako.template.Template экземпляры как значения - тогда

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

Это предполагает, что theobj является экземпляром класса нового стиля (а не устаревших, наиболее избегаемых «старых» классов, которые по-прежнему являются стандартными для Python 2 - если вы их используете, вы должны определенно обновите свой код до нового стиля классы, но использование theobj.__class__ является работоспособным, если он взломан, заменителем t для type(theobj) здесь). default_templ - это экземпляр шаблона по умолчанию, который используется для «ни одного из вышеперечисленных» (если вы предпочитаете исключение, если theobj имеет не признанный тип, используйте квадратичную индексацию вместо вызова .get).

Обратите внимание, что это не (непосредственно) «Поддержка наследования» - если (например) класса foo карты в type2templ в шаблоне bar, то вы делаете подкласс baz из foo но явно не запишет в type2templ, что шаблон, который должны использовать его экземпляры, вы получите шаблон по умолчанию для экземпляров baz. Поддержка наследования более сложна - если вы просто не делаете экземпляр шаблона mako одним из атрибутов класса, конечно, что делает его тривиальным (просто theobj.thetempl, если вы назовете этот атрибут thetempl! -), но я понимаю, что отделить представление от модель.

 Смежные вопросы

  • Нет связанных вопросов^_^