簡體   English   中英

從 Python 中的 __str__ 方法返回 int

[英]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__方法的對象,以及處理對象的一些聰明之處其字符串表示是遞歸的。

你可以在這里這里看到strrepr的源代碼(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM