class - Python使用print( )打印类或者类的对象?

使用print()函数打印类Foobar的对象时,我得到如下输出:


<__main__.Foobar instance at 0x7ff2a18c>

例如,在类对象上调用print()时,我希望以特定格式打印它数据成员,如何在python中实现这个?

如果熟悉C 类,可以通过以下命令来为标准ostream实现上述操作,friend ostream& operator << (ostream&, const Foobar&)类的方法。

时间:


>>> class Test:
... def __repr__(self):
... return"Test()"
... def __str__(self):
... return"member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print t
member of Test

__str__方法是打印时发生的,__repr__方法是在使用repr()函数(或者当你用交互式提示查看它时)时发生的,

如果未给出__str__方法,python将打印__repr__的结果,如果你定义了__str__但不是__repr__,python将使用上面看到的内容作为__repr__,但是仍然使用__str__打印。

来自repr() 文档:

对于许多类型,此函数尝试返回传递给eval()的对象的字符串,否则表示为包含对象名称和地址的字符串,类可以通过定义__repr__()方法来控制此函数为其实例返回的内容。

给出了以下类测试:


class Test:
 def __init__(self, a, b):
 self.a = a
 self.b = b

 def __repr__(self):
 return"<Test a:%s b:%s>" % (self.a, self.b)

 def __str__(self):
 return"From str method of Test: a is %s, b is %s" % (self.a, self.b)

,将在python shell中执行以下操作:


>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print t
From str method of Test: a is 123, b is 456
>>> print str(t)
From str method of Test: a is 123, b is 456

如果没有定义__str__方法,print t (或print str(t) )将使用__repr__的结果,

如果未定义__repr__方法,则使用默认值,这相当于。


def __repr__(self):
 return"<%s instance at %s>" % (self.__class__.__name__, id(self))

你需要使用repr,例如:


class Foobar():
"""This will create Foobar type object."""

 def __init__(self):
 print"Foobar object is created."

 def __repr__(self):
 return"Type what do you want to see here."

a = Foobar()

print a

为了向 @dbr's 答案添加我的两分,下面是一个示例,它是如何从他引用的官方文档实现这个句子的示例:

"[...] 返回将在传递给 eval(), [...] 时具有相同值的对象的字符串"

给定此类定义:


class Test(object):
 def __init__(self, a, b):
 self._a = a
 self._b = b

 def __str__(self):
 return"An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

 def __repr__(self):
 return 'Test("%s","%s")' % (self._a, self._b)

现在,很容易序列化 Test 类的实例:


x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

所以,运行最后一段代码,我们将得到:


Human readable: An instance of class Test with state: a=hello b=world
Object representation: Test("hello","world")

Human readable: An instance of class Test with state: a=hello b=world
Object representation: Test("hello","world")

但是,就像我在最后一条评论中所说的: 更多信息只是这里的

...