Python中__repr__和__str__区别

如下:

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49)
Type "help", "copyright", "credits" or "license" for
>>> class Test(object):
...     def __init__(self, value=‘hello, world!‘):
...         self.data = value
...
>>> t=Test()
>>> t
<__main__.Test object at 0x0000029579FDF668>
>>> print(t)
<__main__.Test object at 0x0000029579FDF668>   

# 看到了么?上面打印类对象并不是很友好,显示的是对象的内存地址
# 下面我们重构下该类的__repr__以及__str__,看看它们俩有啥区别

# 重构__repr__
>>> class TestRepr(Test):
...     def __repr__(self):
...         return ‘TestRepr(%s)‘ % self.data
...
>>> tr = TestRepr()
>>> tr
TestRepr(hello, world!)
>>> print(tr)
TestRepr(hello, world!)        

# 重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了

# 重构__str__
>>> class TestStr(Test):
...     def __str__(self):
...         return "[Value:%s]" % self.data
...
>>> ts=TestStr()
>>> ts
<__main__.TestStr object at 0x0000029579FDF898>
>>> print(ts)
[Value:hello, world!]           

# 你会发现,直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了

__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。

  • 打印操作会首先尝试__str__和str内置函数(print运行的内部等价形式),它通常应该返回一个友好的显示。
  • __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用__str__,会使用print和str。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。

当我们想所有环境下都统一显示的话,可以重构__repr__方法;当我们想在不同环境下支持不同的显示,例如终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示,实际上__str__只是覆盖了__repr__以得到更友好的用户显示。

原文:http://blog.csdn.net/luckytanggu/article/details/53649156

时间: 2024-10-08 18:59:31

Python中__repr__和__str__区别的相关文章

Python中__repr__和__str__区别(转)

class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Test() >>> t <__main__.Test at 0x7fa91c307190> >>> print t <__main__.Test object at 0x7fa91c307190> # 看到了么?上面打印类对象并不是很友好,显示的是对象

python中is和==的区别

Python中  is 和 == 的区别的笔记 在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等可以用==,也可以用is.==和is操作的区别是: is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址. ==比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法. 清楚is和==的区别之后,对此也许你有可能会遇到下面的这些困惑,于是就有了这样一篇文章,试图把Python中一些隐晦的东西趴出来,希望对你有一定的

python中==和is的区别

Python中的对象包含三要素:id.type.value, 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值.is判断的是a对象是否就是b对象,是通过id来判断的:==判断的是a对象的值是否和b对象的值相等,是通过value来判断的.如下代码或许可以帮助我们理解.>>> a = 1>>> b = 1.0>>> a is bFalse>>> a == bTrue>>> id(a)127770

python中魔法方法__str__与__repr__的区别

提出问题 当我们自定义一个类时,打印这个类对象或者在交互模式下直接输入这个类对象按回车,默认显示出来的信息好像用处不大.如下所示 In [1]: class People: ...: def __init__(self, name, sex): ...: self.name = name ...: self.sex = sex ...: In [2]: p = People('xiaoming', 'male') In [3]: p Out[3]: <__main__.People at 0x7

Python中classmethod与staticmethod区别

classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法. 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例. 普通对象方法至少需要一个self参数,代表类对象实例 类方法有类变量cls传入,从而可以用cls做一些相关的处理.并且有子类继承时,调用该类方法时,传入的类变

python 重写__repr__与__str__函数

'''重写:将函数重写定义写一遍 __str__():在调用print打印对象时自动调用,是给用户用的,是一个描述对象的方法.__repr__():是给机器用的,在Python解释器里面直接敲对象名在回车后调用的方法注意:在没有str时,且有repr,str = repr '''class Person(object): def __init__(self, name, age, height, weight): self.name = name self.age = age self.heig

python 中一些关键字的区别

一.raw_input 和input input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 1.当输入为纯数字时 input返回的是数值类型,如int,float raw_inpout返回的是字符串类型,string类型 2.当输入为字符串表达式时 input会计算在字符串中的数字表达式,而raw_input不会. 比如输入 “57 + 3”: input会得到整数60 raw_input会得到字符串”57 + 3” 比如输入 “5,4,

python中break与continue区别

1.在其他语言中break与continue也被经常使用到,其中用法稍微有些去别,下面我们使用python的语法结构来看看是否和在其他语言中的使用方法一致. continue:是跳出本次循环,进入到下一次循环中: break:是直接跳出循环,终止执行: break举例代码如下: names = ['marry','lily','lilei']for name in names: if name == 'lily': break print(name)else: print('猜名字游戏结束')

python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 1 与类和实例无绑定关系的function都属于函数(function): 2 与类和实例有绑定关系的function都属于方法(method). “与类和实例无绑定关系”就道出了其中的关键 我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了. 定义User类 可以使用__slots__来限制绑定的属性和方法 1 user