Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。
功能
定义对象被 str()函数调用时的行为, 一般面向程序使用者。
参数
self 代表对象本身。
返回值
必须是字符串,否则抛出异常。
示例
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
if __name__ == "__main__":
p = Point(3, 4)
print(p)
执行结果:
<__main__.Point object at 0x000001FD666F7B50>
这段代码中定义了一个简单的类,它当中有 x 和 y 两个元素,但是如果直接运行的话,屏幕上会输出一个地址。这个结果是解释器在执行的时候这个实例的一些相关信息,但几乎没有参考意义,我们想要的是这个实例当中具体的值,而不是一个内存当中的地址。
想要实现这个功能,有很多方法,其中之一是__str__。
__str__方法类似于Java当中的toString方法,可以根据需要返回实例转化成字符串之后的结果。
比如,可以在类当中重载这个方法,就可以根据需要输出结果了:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f'x: {self.x}, y: {self.y}'
if __name__ == "__main__":
p = Point(3, 4)
print(p)
执行结果:
x: 3, y: 4
再看如下示例:
class MyText:
name = 1
# def __repr__(self) -> str:
# return '嗯哼'
def __str__(self):
return 'My is str'
sample = MyText()
print(sample) # My is str
print(str(sample)) # My is str
执行结果:
My is str
My is str
__repr__和__str__方法的总结:
1、如果 __repr__和__str__都没有被定义, 那么print(对象),print(str(对象)),print(repr(对象))都会输出对象的地址。
2、如果只有__repr__被定义,那么那么print(对象),print(str(对象)),print(repr(对象))都会输出该方法的返回值。
3、如果只有__str__被定义,那么print(对象)和print(str(对象))会输出该方法的返回值,print(repr(对象))会输出对象的地址。
4、如果两个都被定义,那么print(对象)会输出__str__方法的返回值,print(str(对象)),print(repr(对象))会输出各自方法的返回值。
简单来说,__str__可以被__repr__代替(__str__没有定义时),反之不行,但__str__的优先级更高。