python魔法方法:__repr__与__str__

liftword2周前 (04-15)技术文章6

在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():...

用 Python 重构 God 类:万物皆有其位

抵制将更多代码转储到您正在处理的类中而不是打开正确的代码或者创建一个新代码的冲动是困难的。 你为什么不把那个盘子放在洗碗机而不是水槽里呢?神的课就是从这里来的。 班级知道的太多了。 带有导入列表的那个...

机器学习特征筛选:向后淘汰法原理与Python实现

来源:DeepHub IMBA本文约2100字,建议阅读7分钟本文详细介绍了向后淘汰法的工作原理、实施步骤、优势局限性,并提供了多种Python实现方式。向后淘汰法(Backward Eliminat...

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

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