这是如何在标准python库中定义Template类的实现细节。具体地说,如果您看一下string.py source,Template是使用一个metaclass实现的,它基于类初始化时的delimiter属性的值将一个额外的模式属性烘焙到类中。在
一旦类被初始化,替换模式就被冻结了,因此您必须在类定义时使用推荐的子类方法来重写delimiter,或者做一些更有趣的事情来覆盖元类行为。在
例如from string import Template
class MyTemplate(Template):
@classmethod
def setDelim(cls, delim):
cls.delimiter = delim
>>> MyTemplate.pattern.pattern
# Outputs: '\n \\$(?:\n (?P\\$) | # Escape sequence of two delimiters\n (?P[_a-z][_a-z0-9]*) | # delimiter and a Python identifier\n {(?P[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier\n (?P) # Other ill-formed delimiter exprs\n )\n '
>>> MyTemplate.setDelim('#')
>>> MyTemplate.pattern.pattern # still frozen to '$' as delimiter
# Outputs: '\n \\$(?:\n (?P\\$) | # Escape sequence of two delimiters\n (?P[_a-z][_a-z0-9]*) | # delimiter and a Python identifier\n {(?P[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier\n (?P) # Other ill-formed delimiter exprs\n )\n '