[英]Returning int from a __str__ method in Python
我知道, 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) 時不允許我返回,據我了解,它也被評估為mc.__str__()
。
str()
調用PyObject_Str()
。 這是定義PyObject_Str()
的源代碼。 如果在此文檔中搜索“ __str__
”,您將看到該函數調用__str__
,並確保返回類型實際上是一個字符串。
內置的str
函數(以及repr
)不只是調用.__str__
(或.__repr__
) - 它們還有默認值來處理沒有__str__
或__repr__
方法的對象,以及處理對象的一些聰明之處其字符串表示是遞歸的。
你可以在這里和這里看到str
和repr
的源代碼(在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
函數。
str
不僅僅是
def str(obj):
return obj.__str__()
我認為很少有標准函數或運算符直接映射到這樣的魔術方法,盡管我不確定確切的計數。
str
試圖__str__
,但它也試圖__repr__
如果沒有__str__
,並強制執行的str
返回類型。 (由於技術原因,它也會調用返回值的__init__
, 這對str
子類來說可能很奇怪 。) +
嘗試__add__
,但它也會嘗試__radd__
。 iter
嘗試__iter__
,但它也嘗試__getitem__
。 這個清單一直在繼續。
__str__
提供了一個契約:你返回一個字符串,當程序期望一個字符串時,程序在嘗試使用非字符串值時不會中斷。 確定__str__
是否實際上遵守該合同通常是不可計算的,因此由程序員來執行合同。
正如@ Juanpa.arrivillaga指出的那樣, str
對於__str__
方法返回應該是什么只是更嚴格。 您對__str__
顯式調用實際上並未調用協議; 它返回一個int
值,但該值本身有一個__str__
方法,它在需要str
值時print
調用。
__str __與Java中的ToString方法類似,您將獲得類對象的友好打印。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.