__repr__与__str__

这两者主要是用来显示、打印对象。那么他们有什么差别和关联呢。

首先说下str()和repr内建函数。概括的说str()返回值是给人看的,repr()是给机器看的,而repr()函数得到的字符串通常能够用来又一次获得该对象,通常情况下 obj==eval(repr(obj)) 这个等式是成立的。str()会调用__str__,repr()会调用__repr__。

对于打印操作会尝试使用__str__,可是假设没有这个函数则会尝试使用__repr__。对于类来说其它的地方都是使用__repr__,比方getattr(obj,attr)。

看以下这个样例

>>> class b:
...     def __init__(self):
...             self.x=‘1‘
...     def doit(self):
...             print self.x
...     def __repr__(self):
...             return self.__attrnames()
...     def __attrnames(self):
...             result = ‘‘
...             for attr in dir(self):
...                     result+=‘\n%s=%s‘ %(attr,getattr(self,attr))
...             return result
...
>>> ab = b()
>>> ab

当我们在交互模式输入ab的时候,他会尝试调用__repr__方法,在上面的代码中__repr__又会调用__attrnames方法,而__attrnames中使用了getattr(self,attr),当參数attr是__init__等方法时,getattr会尝试调用__repr__方法。这样就形成了一个循环。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames
  File "<stdin>", line 7, in __repr__
  File "<stdin>", line 11, in __attrnames

处理这个问题的方式就是用__str__替换__repr__就能够了。

时间: 2024-10-14 10:16:37

__repr__与__str__的相关文章

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 ...

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 重写__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中__str__与__repr__

(1)背景 python中,对于类(自定义类)的实例对象的默认显示既没有太大用处,也不美观.比如: 1 class adder: 2 def __init__(self,value=0): 3 self.data=value #初始化数据 4 def __add__(self,other): 5 self.data+=other 6>>> x=adder()7>>>print(x) <__main__.adder. object at 0x.....> 8&

__str__,__repr__,__add__

class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __repr__(self): return 'School(%s,%s)' %(self.name,self.addr) def __str__(self): return '(%s,%s)' %(self.name,self.addr) def __add__(self, other): retur

python3.x __str__与__repr__

__repr__和__str__用于显示,__str__是面向用户的,而__repr__面向coder[调试与开发] 输出的话先调用__str__,通常返回时字符串显示, __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用__str__,会使用print和str. 它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示 以下是打印一个对象的信息, 重载该类的__str__,__repr__,__gt__,__lt__,__eq__等 c

关于__str__ 和 __repr__方法的用法和区别

之前在学习python的时候,经常会在class(类)中遇到__str__方法,这个当时查了一下,发现这个方法是为了打印类的属性而出现的,通常对于实例化的类,如果直接对其进行打印,那么输出打印的将会是这个对象的类型和对象所在的地址.事实上,我们的本意往往是想了解该对象的基本信息,例如该对象有哪些属性,它们的值各是多少等等.但默认情况下,我们得到的信息只会是“类名+object at+内存地址”,对我们了解该实例化对象帮助不大.那么,有没有可能自定义输出实例化对象时的信息呢?答案是肯定,通过重写类

流程python学习笔记:第一章

这一章中作者简要的介绍了python数据模型,主要是python的一些特殊方法.比如__len__, __getitem__. 并用一个纸牌的程序来讲解了这些方法 首先介绍下Tuple和nametuple的区别: Nametuple是类似于元组的数据类型.除了能够用索引来访问数据,还支持用方便的属性名来访问数据. 传统的元组访问如下.对每个元素的访问都必须通过索引来找到.这种找法很不直观 tup1=('abc','def','ghi') print tup1[1] 使用nametuple来构造:

python中基于descriptor的一些概念(上)

@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(new-style class) 2.3.1 __init__方法 2.3.2 __new__静态方法 2.4. 新式类的实例 2.4.1 Property 2.4.2 __slots__属性 2.4.3 __getattribute__方法