我想创建一个__str__
方法,根据用户的选择创建各种格式的字符串。
我提出的最好的方法是制作__str__(**kwargs)
方法,这看起来没问题,但它与str(obj)
或print(obj)
不兼容。换句话说,我必须使用print(obj.__str__(style='pretty'))
而不是print(obj, style='pretty')
。
答案 0 :(得分:7)
改为实施object.__format__()
method,然后用户可以指定format()
function和str.format()
method所需的格式:
print(format(obj, 'pretty'))
或
print('This object is pretty: {:pretty}'.format(obj))
您可能希望将格式的大部分处理委托给str.__format__
:
def __format__(self, spec):
if spec.endswith('pretty'):
prettified = self.pretty_version()
return prettified.__format__(spec[:-6])
return str(self).__format__(spec)
这样,您仍然可以支持默认str.__format__
方法支持的所有字段宽度和填充对齐选项。
演示:
>>> class Foo():
... def __str__(self):
... return 'plain foo'
... def pretty_version(self):
... return 'pretty foo'
... def __format__(self, spec):
... if spec.endswith('pretty'):
... prettified = self.pretty_version()
... return prettified.__format__(spec[:-6])
... return str(self).__format__(spec)
...
>>> f = Foo()
>>> print(f)
plain foo
>>> print(format(f))
plain foo
>>> print(format(f, 'pretty'))
pretty foo
>>> print(format(f, '>20pretty'))
pretty foo
>>> print('This object is pretty: {:^20pretty}!'.format(f))
This object is pretty: pretty foo !