Python学习笔记 1-字符串表示__repr__和__str__
字符串表示
Python的数据模型提供了两个特殊函数来让用户个性化一个类实例的字符串表示,分别是__repr__
和__str__
。举《Fluent Python》书中的例子,实现一个简单的二维向量:
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)
def __str__(self):
return 'Just a 2-d vector (%r, %r)' % (self.x, self.y)
>>> v = Vector(1, 2)
>>> print(repr(v))
Vector(1, 2)
>>> print(str(v))
Just a 2-d vector (1, 2)
>>> print(v)
Just a 2-d vector (1, 2)
可以看到,__repr__
和__str__
都可以给出一个类实例的字符串表示,但他们的用法有些区别:
-
__repr__
给出的字符串表示一般就跟你创建这个实例的源代码一样,即Vector(1, 2)
;所以它一般面向programmer,通常用于打日志以及调试的时候使用。(但奇怪,自己在Pycharm里进行调试的时候使用的字符串表示是__str__
,如下图) -
__str__
给出的字符串表示一般更加接近人类的自然语言描述,有语义信息;所以它一般面向普通用户,像print
函数用的就是__str__
。
如果你只想实现其中一个函数,书中建议实现
__repr__
,因为当__str__
没有实现的时候,Python解释器会调用__repr__
作为备选方案。
用途
字符串表示有非常多的用途,举目前很流行的深度学习框架pytorch,当需要定义自己的模型时,我们一般重载nn.Module
类,然后指定网络结构。Pytorch框架自己重载了__repr__
的实现,于是我们可以在终端打印自己定义的模型:
from torchvision import models
vgg = models.vgg11()
print(vgg)