软件测试学习 之 Python 列表打印问题-元素为对象

 问题描述:

定义如下一个家具类,两个属性:家居名称和占地面具,重写str方法用于打印家具信息

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return "%s占地%.2f" % (self.name, self.area)

 定义包含家具元素的列表并打印

bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)
item_list = [bed, chest, table]

# 使用重写的__str__打印信息
print(bed)
print(chest)
print(table)
print()

# 直接打印列表
print(item_list)
print()

 结果如下:

席梦思占地4.00
衣柜占地2.00
餐桌占地1.50

[<家具.house_item.HouseItem object at 0x000000000220AA58>, 
<家具.house_item.HouseItem object at 0x000000000220A470>, 
<家具.house_item.HouseItem object at 0x000000000220A358>]

打印列表的时候,直接打印了路径、类型和地址? 

原因分析:

列表中的元素直接打印时,不会调用元素的str方法,而是调用repr方法

解决方法:

重写repr方法

    def __repr__(self):
        return "%s占地%.2f" % (self.name, self.area)

输出结果:

[席梦思占地4.00, 衣柜占地2.00, 餐桌占地1.50]

 相关知识点:

Python中__repr__和__str__区别

先看下面几个例子:

重写__repr__

class TestRepr():
    # 重写reqr方法
    def __repr__(self):
        return 'TestRepr(%s)' % "hello,world"

>>> tr = TestRepr()
>>> tr               不print,直接终端显示,面向程序员
TestRepr(hello,world!)
>>> print tr         print是面向用户
TestRepr(hello,world!)

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

重写__str__

calss TestStr():
    # 重写str方法
    def __str__(self):
        return '[Value: %s]' % "hello,world"

>>> ts = TestStr()
>>> ts
<__main__.TestStr at 0x7fa91c314e50>
>>> print ts
[Value: hello,world!]

重写__str__方法后,直接输出对象时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了

同时重写__repr__和__str__

ipython执行结果如下(python version 3.7.2)

In[13]: class TestAll():
   ...:     def __init__(self):
   ...:         self.data = "hello,world"
   ...: 
   ...:     # 重写reqr方法
   ...:     def __repr__(self):
   ...:         return 'repr: TestAll(%s)' % self.data
   ...: 
   ...:     # 重写str方法
   ...:     def __str__(self):
   ...:         return 'str: TestAll(%s)' % self.data
   ...:     
In[14]: ta = TestAll()
In[15]: ta
Out[15]: repr: TestAll(hello,world)
In[16]: print(ta)
str: TestAll(hello,world)

直接输出对象是调用了repr方法,通过print打印时,调用了str方法

结论: 

        1. __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。
            print会首先调用str内置函数(print运行的内部实现方式),尝试调用对象的__str__方法,它通常应该返回一个友好的显示

        2. __repr__用于所有其他的环境中:用于交互模式下提示回应,可以直接使用__str__,也可以使用print和str,如果都没有使用,而直接输出对象,则会调用repr函数。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示

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


以上内容参考以下博文,结合自己实践整理
作者:Tab609 
来源:CSDN 
原文:Python中__repr__和__str__区别

作者:梯度人生 
来源:CSDN 
原文:对于列表存放的元素为对象时而直接打印列表的时候只出现地址的问题描述与原因分析

猜你喜欢

转载自blog.csdn.net/jian3x/article/details/89017522