<p>解决这个问题的第一种方法可能是<code>try</code>它:</p>
<pre><code>class MyIntegerTenClass:
def __int__(self):
return 10
def __str__(self):
return 'ten'
def __format__(self, format_spec):
try:
s = format(str(self), format_spec)
except ValueError:
s = format(int(self), format_spec)
return s
</code></pre>
<p>如果<code>MyIntegerTenClass</code><em>可以作为字符串插入到格式字符串中,那么它将是。否则,它将转换为int并重新提交到<code>format</code>。</p>
<pre><code>>>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten)
ten, ten, 10, 0A, 10.000000
</code></pre>
<p>如果希望默认表示为<code>10</code>,而不是<code>ten</code>,则只需交换转换行:</p>
<pre><code> def __format__(self, format_spec):
try:
s = format(int(self), format_spec)
except ValueError:
s = format(str(self), format_spec)
return s
</code></pre>
<p>测试输出:</p>
<pre><code>>>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten)
10, ten, 10, 0A, 10.000000
</code></pre>
<p>作为补充,我不相信不定义<code>__format__</code>就可以获得所需的行为;但是,可以使用<a href="http://docs.python.org/library/string.html#string-formatting" rel="nofollow">^{<cd7>}</a>对象开发更复杂的方法。不过,我认为基于异常的方法免费为您提供了很多内置功能。</p>