使用str.format()访问对象属性

Ada*_*hes 37 python string string-formatting

我有一个属性的Python对象a,b,c.

我仍然使用旧的字符串格式,所以我通常手动打印:

 print 'My object has strings a=%s, b=%s, c=%s' % (obj.a, obj.b, obj.c)
Run Code Online (Sandbox Code Playgroud)

最近,我的琴弦已获得超级长,我宁愿能够简单地传递对象转换成字符串格式的功能,是这样的:

 print 'My object has strings a=%a, b=%b, c=%c'.format(obj)
Run Code Online (Sandbox Code Playgroud)

但是,语法不正确.这可能吗?

iCo*_*dez 55

您可以.attribute_name在格式字段本身内使用表示法:

print 'My object has strings a={0.a}, b={0.b}, c={0.c}'.format(obj)
Run Code Online (Sandbox Code Playgroud)

以下是演示:

>>> class Test(object):
...     def __init__(self, a, b, c):
...         self.a = a
...         self.b = b
...         self.c = c
...
>>> obj = Test(1, 2, 3)
>>> 'My object has strings a={0.a}, b={0.b}, c={0.c}'.format(obj)
'My object has strings a=1, b=2, c=3'
>>>
Run Code Online (Sandbox Code Playgroud)

但请注意,执行此操作时,您需要对格式字段进行编号.此外,正如您所看到的,该str.format函数的格式字段用花括号表示{...},而不是%符号.

有关更多信息,请参阅Python中的格式字符串语法.

  • 这看起来更好:`print'我的对象有字符串a = {obj.a},b = {obj.b},c = {obj.c}'.format(obj = obj)` (11认同)
  • 还有`'{a} {b}'.format(**vars(obj))`或`'{a} {b}'.format(**obj .__ dict __)` (7认同)

Geo*_*ing 14

我认为最好使用vars()来访问对象的属性dict而不是usng __dict__.

所以你可以这样做:

"My object has strings a={a}, b={b}, c={c}".format(**vars(obj))
Run Code Online (Sandbox Code Playgroud)

有关vars()优选原因的更多背景__dict__,请参阅问题的答案使用dict或vars()?.


Chr*_*ian 5

正如@igniteflow写的一篇评论:

'My object has strings a={a}, b={b}, c={c}'.format(**obj.__dict__)
Run Code Online (Sandbox Code Playgroud)

我有限的python理解:.__dict__是一个包含所有实例属性的dict,**运算符基本上将它们解包并将它们作为key = value args添加到方法中

  • 好的!使用“**”是关键。在示例中包含 .__dict__ 是不幸的,因为它使它看起来比实际更复杂。例如 '我的对象有字符串 a={a}, b={b}'.format(**{'a':'hi', 'b':'mom'}) (2认同)