从Python中的__str__方法返回int

Nar*_*rta 13 python string cpython python-internals

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

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

class MyClass(object):

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

mc = MyClass()
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

print(str(mc))
Run Code Online (Sandbox Code Playgroud)

口译员抱怨说:

TypeError: __str__ returned non-string (type int)
Run Code Online (Sandbox Code Playgroud)

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

但如果我尝试:

print(mc.__str__())
Run Code Online (Sandbox Code Playgroud)

我得到输出:5.

那么为什么解释器允许我在__str__直接调用时返回int ,而不是当我使用str(mc)时 - 正如我所理解的那样 - 也被评估为mc.__str__().

JET*_*ETM 5

str()电话PyObject_Str().PyObject_Str()是定义的源代码.如果在此文档中搜索" __str__",您将看到函数调用的位置__str__,并确保返回类型实际上是一个字符串.


che*_*ner -1

__str__提供了一个契约:您返回一个字符串,并且当程序需要字符串时尝试使用非字符串值时,程序不会中断。判断是否__str__确实遵守该契约通常是不可计算的,因此由程序员来执行该契约。

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