Какой чистый способ использовать разные шаблоны в зависимости от класса объекта? кроме Buncha если заявленияMako шаблон в зависимости от класса объекта?
ответ
Вы можете сделать 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
! -), но я понимаю, что отделить представление от модель.
При работе в Python выполнение разных вещей, основанных на типе объекта, почти всегда является недостатком дизайна. Возможно, вам следует предварительно обработать ваши данные, чтобы шаблон мог получить к нему доступ прямолинейно? –
Я сделаю это, я просто понимаю, что я могу делать неправильно – Timmy