1

我有一个要打印到终端的对象,它看起来像这样:

>>> print b
<p>„De neergang kan een duikvlucht worden.”&lt;/p>

所以我想知道这个结果来自哪个函数。所以我尝试了以下方法:

>>> b.__repr__()
'<lxml.etree._XSLTResultTree object at 0x112c6a980>'
>>> b.__str__()
'\xe2\x80\x9eDe neergang kan een duikvlucht worden.\xe2\x80\x9d</p>'
>>> b.__unicode__()
'u'<p>\u201eDe neergang kan een duikvlucht worden.\u201d</p>'

如您所见,这些函数都没有显示print语句显示的内容。我一直认为这print实际上显示了__repr__(),__str__()或的结果__unicode__(),但显然不是这样。

那么print实际上叫什么?

4

2 回答 2

3

检查这类事情很容易:

>>> class C(object):
    def __repr__(self):
        print("repr called")
        return "repr"
    def __str__(self):
        print("str called")
        return "str"
    def __unicode__(self):
        print("unicode called")
        return "unicode"


>>> print C()
str called
str
>>> 

事实上,内部发生的是print(作为一个函数,虽然我认为它是相同的,但我没有检查操作码)使用 Py_PRINT_RAW 标志调用 PyFile_WriteObject 。

int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)

将对象 obj 写入文件对象 p。唯一支持的标志是 Py_PRINT_RAW;如果给定,则写入对象的 str() 而不是 repr()。成功返回 0,失败返回 -1;将设置适当的例外。

于 2016-03-22T13:47:48.563 回答
0

object.__str__(self)

str(object)内置函数调用format()print()计算对象的 >'informal' 或可很好打印的字符串表示。返回值必须 > 是一个字符串对象。

这是来自 python文档。很明显,如果你在类中和类中定义,print函数将调用 defined 。但是在你刚刚实现的情况下,就应该使用.__str()____str()____repr()____repr()__print(object)__repr()__

希望这会有所帮助。

于 2019-02-19T00:10:41.243 回答