如何更改Python类的字符串表示?

309 投票
2 回答
241155 浏览
提问于 2025-04-16 11:19

在Java中,我可以重写我自己类的toString()方法。这样,Java的打印功能就会输出这个对象的字符串表示,具体内容由toString()定义。那么在Python中,有没有类似于Java的toString()的方法呢?

举个例子,我有一个叫PlayCard的类。我创建了这个类的一个实例c。现在:

>>> print(c)
<__main__.Card object at 0x01FD5D30>

但我想要的效果是这样的:

>>> print(c)
A♣

我该如何自定义我类实例的字符串表示呢?

我使用的是Python 3.x

2 个回答

48

这件事并没有看起来那么简单,有些核心库的功能在只重写str的时候是无法正常工作的(我在Python 2.7中检查过),可以看看这个讨论帖里的例子:如何让一个类可以被JSON序列化。另外,试试这个:

import json

class A(unicode):
    def __str__(self):
        return 'a'
    def __unicode__(self):
        return u'a'
    def __repr__(self):
        return 'a'

a = A()
json.dumps(a)

会产生:

'""'

而不是:

'"a"'

这并不是我们预期的结果。

编辑:回应mchicago的评论:

unicode没有任何属性——它是一个不可变的字符串,其值是隐藏的,无法通过高级的Python代码访问。json模块使用re来生成字符串表示,这似乎可以访问这个内部属性。这里有一个简单的例子来说明这一点:

b = A('b')
print b

会产生:

'a'

而:

json.dumps({'b': b})

会产生:

{"b": "b"}

所以你可以看到,一些原生库使用了内部表示,可能是出于性能考虑。

更多细节可以参考这个链接:http://www.laurentluce.com/posts/python-string-objects-implementation/

400

在Java中,toString方法的作用可以通过在你的类中实现__str__来达到。你可以在类的定义里加上这个:

def __str__(self):
     return "foo"

你可能还想实现__repr__,这对调试会有帮助。

想了解更多信息,可以查看这里:

撰写回答