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

时间:2014-11-07 00:17:17

标签: python string string-formatting

我有一个Python对象,其属性为abc

我仍然使用旧的字符串格式,因此我通常会手动打印这些格式:

 print 'My object has strings a=%s, b=%s, c=%s' % (obj.a, obj.b, obj.c)

最近,我的字符串变得越来越长,而且我更愿意将对象简单地传递给字符串格式函数,例如:

 print 'My object has strings a=%a, b=%b, c=%c'.format(obj)

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

5 个答案:

答案 0 :(得分:50)

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

print 'My object has strings a={0.a}, b={0.b}, c={0.c}'.format(obj)

以下是演示:

>>> 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'
>>>

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

有关更多信息,请参阅Python中的Format String Syntax

答案 1 :(得分:12)

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

所以你可以这样做:

"My object has strings a={a}, b={b}, c={c}".format(**vars(obj))

有关vars()优于__dict__的原因的更多背景信息,请参阅问题Use dict or vars()?的答案。

答案 2 :(得分:5)

正如@igniteflow写的一篇评论:

'My object has strings a={a}, b={b}, c={c}'.format(**obj.__dict__)

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

答案 3 :(得分:1)

为了完整起见,在@igniteflow和@Christian的基础上,您可以使用%字符串格式运算符并写:

'My object has strings a=%(a)s, b=%(b)s, c=%(c)s' % obj.__dict__

答案 4 :(得分:0)

依赖于{ "generator-jhipster": { "promptValues": { "packageName": "com.sample" }, "jhipsterVersion": "4.7.0", ..... ..... "jhiPrefix": "jhi", ........ } } 的一些建议答案不适用于不可变对象:

vars(...)

我认为最好坚持使用可靠的东西并明确列出你需要打印的东西。

如果您需要打印大量属性,那么将这些值存储为属性可能不是最佳选择。