我有一个Python对象,其属性为a
,b
,c
。
我仍然使用旧的字符串格式,因此我通常会手动打印这些格式:
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)
但是,语法不正确。这可能吗?
答案 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(...)
我认为最好坚持使用可靠的东西并明确列出你需要打印的东西。
如果您需要打印大量属性,那么将这些值存储为属性可能不是最佳选择。