学习《流畅的Python学习》- 笔记02

mac2024-03-14  29

1.2.2 字符串表示形式

repr的用处。

Python 有一个内置的函数叫 repr,它能把一个对象用字符串的形式表 达出来以便辨认,这就是“字符串表示形式”。repr 就是通过 repr 这个特殊方法来得到一个对象的字符串表示形式的。如果没有实现 repr,当我们在控制台里打印一个向量的实例时,得到的字符串 可能会是 <Vector object at 0x10e100070>。 交互式控制台和调试程序(debugger)用 repr 函数来获取字符串表示 形式;在老的使用 % 符号的字符串格式中,这个函数返回的结果用来代 替 %r 所代表的对象;同样,str.format 函数所用到的新式字符串格 式化语法(https://docs.python.org/2/library/string.html#format-stringsyntax)也是利用了 repr,才把 !r 字段变成字符串。

def __repr__(self): return 'Vector(%r, %r)' % (self.x, self.y)

!符号,这个只在fromat中有用,要注意方法。但是效果类似

a = '123' b = 'hello, {!r}'.format(a) print(b) # hello, '123'

而下面这种写法则报错

a = '123' # b = 'hello, {!r}'.format(a) b = 'hello, !r' % '123' print(b)

报错

Traceback (most recent call last): File "C:/Users/mengy/Downloads/Weixin-master/Weixin-master/test.py", line 3, in <module> b = 'hello, !r' % '123' TypeError: not all arguments converted during string formatting

在 repr 的实现中,我们用到了 %r 来获取对象各个属性的标准字 符串表示形式——这是个好习惯,它暗示了一个关键:Vector(1, 2) 和 Vector(‘1’, ‘2’) 是不一样的,后者在我们的定义中会报错,因为向量对象的构造函数只接受数值,不接受字符串 。

实际上,Vector 的构造函数接受字符串。而且,对于使用字符串构造的 Vector,这 6 个特 殊方法中,只有 abs 和 bool 会报错。此外,1.2.4 节定义的 bool 不会报错。 ——编者注

repr 所返回的字符串应该准确、无歧义,并且尽可能表达出如何 用代码创建出这个被打印的对象。因此这里使用了类似调用对象构造器 的表达形式(比如 Vector(3, 4) 就是个例子)。 repr 和 str 的区别在于,后者是在 str() 函数被使用,或 是在用 print 函数打印一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。

如果你只想实现这两个特殊方法中的一个,repr 是更好的选择, 因为如果一个对象没有 str 函数,而 Python 又需要调用它的时 候,解释器会用 repr 作为替代。

总结一下: %r用rper()方法处理对象,%r打印时能够重现它所代表的对象或者说直接反应对象本体 %s用str()方法处理对象

处理int型对象时,3种方法并无区别 print("I am %d years old." % 22) print("I am %s years old." % 22) print("I am %r years old." % 22) # I am 22 years old. 处理字符串类型对象时,结果就不同了 a = "I am %s years old." % 22 print("i sad %r" % a) #i sad 'I am 22 years old.' print( 'i sad %s' %a) #i sad I am 22 years old.

注意:打印结果 %r 比 %s 多一对引号

打印时间类型对象时 import datetime d = datetime.date.today() print("%s" % d) #2019-10-31 print("%r" % d) #datetime.date(2019, 10, 31)

此处借鉴:博客园博文

最新回复(0)