Python魔法方法(6):__str__(cls[,*args]) 方法

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__的优先级更高。

猜你喜欢

转载自blog.csdn.net/youzhouliu/article/details/125269509