Python中__str__和__repr__的区别
Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会是<__main__.Object at 0x14af07dbe80>,这个表示的是打印的对象,以及对象的内存地址
现在让我们看看__str__和__repr__这两个方法有什么区别
首先定义一个类
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y)
然后我们在控制台上打印这个类的对象实例
>>> Vector(1, 2)
<__main__.Vector at 0x14af07dbe80>
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
从上面的例子我们可以看到,当把变量的实例输入到控制台,会打印出对象的类型和对象的地址,当把对象作为参数传给str或者print方法,则会调用对象的__str__方法
现在,我们删除原来的__str__方法,加上__repr__方法,再在控制台做一样的操作,看看会有什么不同
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)
重复之前打印Vector对象操作
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'repr Vector(1, 2)'
>>> print(Vector(1, 2))
repr Vector(1, 2)
我们可以看到,实现我们没有实现__str__方法,但在调用str()的时候,str()会自动调用__repr__方法,并且在控制台输入对象实例的时候,出来的不再是对象类型和内存地址,而是打印我们所希望表达的对象信息
最后,我们在Vector类中加上__str__和__repr__方法
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y) def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)
重复之前的操作
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
可以知道,当把对象作为参数传入print()时,会自动调用对象的__str__方法,但是当__str__方法不存在时,则会调用__repr__方法。所以,如果你只想实现这两个特殊方法中的一个,建议还是选择__repr__方法。
Python中__str__和__repr__的区别的更多相关文章
- python中__str__与__repr__的区别
__str__和repr __str__和__repr__都是python的内置方法,都用与将对象的属性转化成人类容易识别的信息,他们有什么区别呢 来看一段代码 from math import hy ...
- 浅谈python中__str__和__repr__的区别
很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...
- python中__str__与__repr__
(1)背景 python中,对于类(自定义类)的实例对象的默认显示既没有太大用处,也不美观.比如: class adder: def __init__(self,value=0): self.data ...
- Python中type与Object的区别
Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...
- Django---图书管理系统,一对多(外键设置),__str__和__repr__的区别,进阶版项目说明简介.模版语言if ... else ..endif
Django---图书管理系统,一对多(外键设置),__str__和__repr__的区别,进阶版项目说明简介.模版语言if ... else ..endif 一丶__str__ 和 __repr__ ...
- [Python3 填坑] 015 __str__ 与 __repr__ 的区别
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 上例子 2.2 关系与区别 Python 3.7.3 的官方文档 网上看到一个例子,运行了一下 简单地说 1. print( 坑的信息 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python中的is和==的区别,==判断值是否相等,is判断地址是否一致
Python中的is和==的区别 Python中的对象包含三要素:id.type.value. 其中id用来唯一标示一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是 ...
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
随机推荐
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
- css钻石旋转实现
css钻石旋转实现: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- bootstrap标签tab切换
<ul class="nav nav-tabs" id="myTab"> <li class="active">&l ...
- 多个图标图片(雪碧图)使用CSS样式显示
现在的网页中显示很多图标算是常态,发现项目中页面上用到的图标都是单个图标单个文件,用的时候直接往页面上挂,这确实很常态. 如果,网站是挂在外网上,或者网速过低,又大量使用图标的情况下,由于浏览器和服务 ...
- 介绍一款渗透神器——Burp Suite
Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...
- 将腾讯视频客户端缓冲的文件转换为一个MP4格式文件
打开腾讯视频windows客户端,播放要下载的视频,逐步快进使其缓冲完毕: 按照下图所示,复制缓存路径: 在cmd.exe的界面中输入“cd C:\854456b6d5a187ff3c0f553918 ...
- 【洛谷1337】[JSOI2004] 吊打XXX(模拟退火经典题)
点此看题面 大致题意: 一个平面上有\(n\)个点,每个点有1个权值,现在要选择平面上的一个点,使这\(n\)个点的权值乘上到达选定点的距离之和最小. 模拟退火 我们可以用模拟退火来做这道题. 先将\ ...
- 调试工具DEBUG的使用(8086)
有关CPU和存储单元的概念在前一节我们已经了解,那么如何观察实际机器内部的情况呢?能不能看到具体的寄存器.标志.存储单元的内容呢?可不可以修改和控制它们呢? DEBUG这个有力工具,就可以深入到机器内 ...
- Luogu [P1334] 瑞瑞的木板(手写堆)
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...
- ASIHTTPRequest的使用
本文转自csdn ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中. ...