python __repr__用法_python中str和repr_关于Python中repr和str用法的区别?

我们在用Python的时候,有时候会发现在交互模式下直接输入一个变量跟输入print(变量)打印出来的东西是不一样的。

还有时候,我们打印一个对象,得到的不是我们想要的它的值,而是一个内存地址。

这些现象是为什么呢?这就涉及到了题主所问的问题。

一、__str__和__repr__的作用

在Python中,每一个对象都有__str__和__repr__两个内置函数,它们的作用是把对象用字符串的形式表达出来,方便我们辨认。

在没有重写这两个方法的时候,这两个方法会继承自Object这个父类,不过此时显示的内容并不是很友好,因为object的__str__方法内部是pass,所以会返回给我们的内容会是一个内存地址:

class Test(object):

def __init__(self, value='hello, world!'):

self.data = value

>>> t = Test()

>>> t

>>> print(t)

如果重写了两个内置函数或者其中之一,那么会视情况返回给我们重写后的内容:

# 重构__repr__

class TestRepr(Test):

def __repr__(self):

return 'TestRepr(%s)' % self.data

>>> tr = TestRepr()

>>> tr

TestRepr(hello, world!)

>>> print(tr)

TestRepr(hello, world!)

# 重构__str__

class TestStr(Test):

def __str__(self):

return '[Value:%s]' % self.data

>>> ts = TestStr()

>>> ts

>>> print(ts)

[Value: hello, world!]

从上面的列子可以发现,对于__str__和__repr__这两个内置函数:如果都没有重写,那么就使用继承自Object这个父类的内容;

如果只有__repr__重写了,那么str()和repr()都是调用__repr__;

如果只有__str__重写了,那么str()和repr()各用各的;

如果两个都重写了,那么还是各用各的。

二、__str__和__repr__的区别

如果是用print()、format()、str()这三个function来打印,则会调用__str__来返回字符串;如果直接输入变量、使用repr(),那么会调用__repr__来返回字符串。例如,在交互模式下有:

>>> class Test():

... def __init__(self):

... pass

... def __repr__(self):

... return "the repr"

... def __str__(self):

... return "the str"

>>> a = Test()

>>> a

the repr

>>> print(a)

the str

在Python中,我们可以用str()和repr()来获得一个对象的__str__和__repr__方法返回的字符串。

其中,str()返回的内容可读性较高,可以让我们关注于对象所包含的有用的信息内容。可以用来为最终用户创建输出。

而repr()产生的字符串是给Python解释器看的,力争做到准确无误,会保留对象尽可能多的特征,让Python可以知道这个字符串代表的对象究竟是什么(repr全称是representation)。可以用于调试和开发。

例如下面的例子:

>>> a = 1

>>> print(a) # 使用print函數等同於在螢幕上打印出str(a)

1

>>> a # 直接輸入對象本身等同於在螢幕上打印出repr(a)

1

>>> b = '1'

>>> print(b) # 使用print函數等同於在螢幕上打印出str(b)

1

>>> b # 直接輸入對象本身等同於在螢幕上打印出repr(b)

'1'

在这个例子中,a是整数1,b是字符串'1'。

在用print()的时候会调用str()方法,它将整数1打印成1,这个很好理解;将字符串'1'也打印成1,这是因为1就是这个对象所包含的全部有用的信息内容。

在直接输入这个对象的时候,会调用repr()方法,它将整数1打印成1,这个很直观;它将字符串'1'打印成了'1',也就是带着引号,保留了这个对象的类型特征。

另一个例子,也可以反映出repr保留了更多的变量信息(变量类型):

import datetime

today = datetime.datetime.now()

print str(today)

print repr(today)

>>> print(str(today))

2018-08-22 16:52:37.403320

>>> print(repr(today))

datetime.datetime(2018, 8, 22, 16, 52, 37, 403320)

三、变量在容器中的情况

另外,如果我们的对象是放在list、tuple、set、dict里面是,不论是直接输入这个对象,还是print这个对象,都会调用类的__repr__方法。例如:

>>> class Test():

... def __init__(self):

... pass

... def __repr__(self):

... return "the repr"

... def __str__(self):

... return "the str"

...

>>> a=Test()

>>> _list=[a]

>>> _dict={'a':a}

>>> _set = set({a})

>>> _tuple = (1,a)

>>> _list

[the repr]

>>> print(_list)

[the repr]

>>> _dict

{'a': the repr}

>>> print(_dict)

{'a': the repr}

>>> _tuple

(1, the repr)

>>> print(_tuple)

(1, the repr)

>>> _set

{the repr}

>>> print(_set)

{the repr}

>>>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值