字符串表示
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)

本文探讨了Python中用于字符串表示的特殊方法`__repr__`和`__str__`。`__repr__`通常提供类似源代码的表示,用于程序员调试,而`__str__`则生成更符合自然语言的描述,适合普通用户。在没有实现`__str__`时,Python会默认使用`__repr__`。通过示例展示了这两个方法在深度学习框架PyTorch中定义模型时的作用。
345

被折叠的 条评论
为什么被折叠?



