鉴于这个简单的课程:
class Foo(object):
def __init__(self,a=None):
self.a = a
def __repr__(self):
return "Foo(a='{self.a}')".format(self=self)
我想知道是否有一种简单的方法可以让__repr__
根据a的类型返回不同的格式:
Foo('some_string') # if a is a string
Foo(5) # if a is the integer 5
Foo(None) # if a is None
显然,对于单个属性,我可以测试并使用不同的输出字符串,但我认为有人必须在我面前解决这个问题。具体来说,我有几个属性可以是字符串或无,我不认为为我的__repr__
编写复杂的逻辑很有意义。
答案 0 :(得分:3)
只需使用repr()
的{{1}}:
self.a
return "Foo(a={self.a!r})".format(self=self)
告诉!r
在.format()
上致电repr()
,而不是在值上调用self.a
,请参阅Format String syntax:
__format__()
演示:
>>> '{!r}'.format(0)
'0'
>>> '{!r}'.format('foo')
"'foo'"
答案 1 :(得分:2)
虽然我接受了Martijn的回答,但我想更清楚地明确表明他的建议的结果:
>>> class Foo(object):
... def __init__(self, a=None, b=None):
... self.a = a
... self.b = b
... def __repr__(self):
... return 'Foo(a={self.a!r}, b={self.b!r})'.format(self=self)
...
>>> Foo(a='a')
Foo(a='a', b=None)
>>> Foo(a=5)
Foo(a=5, b=None)