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__().
str()电话PyObject_Str().这PyObject_Str()是定义的源代码.如果在此文档中搜索" __str__",您将看到函数调用的位置__str__,并确保返回类型实际上是一个字符串.
che*_*ner -1
__str__提供了一个契约:您返回一个字符串,并且当程序需要字符串时尝试使用非字符串值时,程序不会中断。判断是否__str__确实遵守该契约通常是不可计算的,因此由程序员来执行该契约。
正如@Juanpa.arrivilillaga 指出的那样,str只是对__str__返回应有内容的方法更加严格。您的显式调用__str__实际上并没有调用协议;它返回一个int值,但该值本身有一个在需要值时调用__str__的方法。printstr