python魔法方法:__repr__与__str__

liftword3个月前 (04-15)技术文章25

在Python中,魔法方法(通常称为特殊方法或双下方法)是面向对象编程中的一个重要概念,它们以两个下划线 __ 开头和结尾,例如 __init__

通常,我们定义一个类,

class Test(object):
    def __init__(self, value='hello, world!'):
        self.data = value

我们打印一个实例化类对象

>> test = Test()
>> test
<__main__.test object at 0x0000018d0ca6cb90>
>> print(test)
 <__main__.test object at 0x0000018d0ca6cb90>

这样看实在是不怎么友好,

我们可以使用__str__,__repr__这两个魔法方法,让显示更友好。

  • __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。
  • 打印对象时首先尝试__str__,它通常应该返回一个友好的显示。 __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,
  • 实际上__str__只是覆盖了__repr__以得到更友好的用户显示。当我们想所有环境下都统一显示的话,可以重构__repr__方法

如果只有__repr__魔法方法,代码如下:

class Test(object):
    def __init__(self, value='hello, world!'):
        self.data = value
    def __repr__(self):
        return self.data

则类对象输出如下:

>> t=Test()
>> t
 hello, world!
>>print(t)
hello, world!

如果同时有__str__和__repr__,代码如下:

class Test(object):
    def __init__(self, value='hello, world!'):
        self.data = value
    def __repr__(self):
        return self.data
    def __str__(self):
        return 'value is %s'%self.data

注意输出的不同

>> t=Test()
>> t
 hello, world!
>> print(t)
value is hello, world!

更友好的写法

class Test(object):
    def __init__(self,value='hello word'):
        self.data=value
    def __str__(self):
        return self.data
    __str__=__repr__  

相关文章

CUDA拥抱Python:真爱还是逢场作戏?

【引言】想象一下,你是一位Python高手,代码写得飞起,但一提到GPU加速,却只能眼巴巴地看着C/C++大佬们秀操作,是不是感觉有点憋屈?别急,好消息来了!英伟达突然宣布,CUDA,这个GPU加速界...

真相!Python函数嵌套实战:解决开发中3大难题,附详细代码解析

一、开发中遇到的问题问题1:变量作用域混乱当内部函数修改外部函数变量时,会报UnboundLocalError。def outer(): x = 10 def inner():...

有bug!用Pytorch Lightning重构代码速度更慢,修复后速度倍增

选自Medium作者:Florian Ernst机器之心编译编辑:小舟、陈萍用了 Lightning 训练速度反而更慢,你遇到过这种情况吗?PyTorch Lightning 是一种重构 PyTorc...

1次订单系统迁移,头发都快掉完了...

本文主要介绍知乎订单系统后端语言栈的转型升级过程,包括其间踩过的一些坑和遇到的一些问题。一来是想通过本篇文章为其他应用服务转型提供借鉴经验,二来是总结对于订单系统的理解。迁移背景随着知乎整体技术栈的变...

Python 的协程和 goroutine 有什么区别?

最近在做后端服务python到go的迁移和重构,这两种语言里,最大的特色和优势就是都支持协程。之前主要做python的性能优化和架构优化,一开始觉得两个协程原理和应用应该差不多,后来发现还是有很大的区...