从Python中的__str__方法返回int

时间:2018-09-11 16:08:59

标签: python string cpython python-internals

我知道str()方法的目的是返回对象的字符串表示形式,所以我想测试一下如果我强迫它做其他事情会发生什么。

我创建了一个类和一个对象:

class MyClass(object):

    def __str__(self, a=2, b=3):
        return a + b

mc = MyClass()

当我打电话时:

print(str(mc))

口译员抱怨:

TypeError: __str__ returned non-string (type int)

这是完全可以理解的,因为str()方法试图返回 int

但是,如果我尝试:

print(mc.__str__())

我得到的输出是:5。

所以为什么解释器允许我直接调用__str__时返回int,而不是我使用str(mc)时返回int(据我所知,str(mc)也被评估为mc.__str__()。 / p>

5 个答案:

答案 0 :(得分:5)

$.each(this, function(k, v) { $('#phone').val($('#phone').val()+', '+v.phone); }); 呼叫PyObject_Str()Here是定义了str()的源代码。如果在此文档中搜索“ PyObject_Str()”,将看到函数在何处调用__str__并确保返回类型实际上是字符串。

答案 1 :(得分:4)

内置的str函数(以及repr)不仅仅调用.__str__(或.__repr__),还具有更多的功能–它们还具有默认值,可以处理那些没有__str____repr__方法,并且在处理字符串表示为递归的对象时比较聪明。

您可以看到strrepr herehere的源代码(用C语言显示)。如您所见,它们强制执行__str____repr__的返回类型:

if (!PyUnicode_Check(res)) {
    PyErr_Format(PyExc_TypeError,
                 "__str__ returned non-string (type %.200s)",
                 Py_TYPE(res)->tp_name);
    Py_DECREF(res);
    return NULL;
}

如果仅在对象上调用__str__方法,Python本身不会强制执行任何称为__str__的方法只能返回字符串–强制执行该操作的是str函数限制。

答案 2 :(得分:2)

str不只是

def str(obj):
    return obj.__str__()

我不确定几乎没有标准函数或运算符直接将 映射到这样的魔术方法,尽管我不确定确切的计数。

str尝试__str__,但是如果没有__repr__,它也会尝试__str__,并强制执行str返回类型。 (出于技术原因,它也将返回值的__init__称为which can get weird for str subclasses。)+尝试使用__add__,但也尝试使用__radd__iter尝试__iter__,但它也尝试__getitem__。该列表不停地出现。

答案 3 :(得分:-1)

<?php namespace [Vendor_Name]\[Module_Name]\Model; use Magento\Checkout\Model\Cart as MagentoCart; use [Vendor_Name]\[Module_Name]\Helper\Data; class Cart extends MagentoCart { protected $helper; public function __construct(Data $helper) { $this->helper = $helper; } // Code ... } 提供了一个约定:您返回一个字符串,并且当程序期望使用字符串时,如果尝试使用非字符串值,则程序不会中断。通常,确定__str__是否实际上遵守该合同是无争议的,因此由程序员强制执行该合同。

正如@ Juanpa.arrivillaga指出的,__str__对于str方法返回应有的内容只是更加严格。您对__str__的显式调用实际上并未调用该协议;它返回一个__str__值,但是该值本身具有一个int方法,__str__在需要一个print值时调用。

答案 4 :(得分:-6)

__ str __在Java中类似于ToString方法,在该方法中您将获得类对象的友好打印。