我知道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>
答案 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__
方法,并且在处理字符串表示为递归的对象时比较聪明。
您可以看到str
和repr
here和here的源代码(用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方法,在该方法中您将获得类对象的友好打印。