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

307
在Java中,我可以重写我的类的toString()方法。然后Java的打印函数将打印由其toString()定义的对象的字符串表示形式。是否有Python等价于Java的toString()
例如,我有一个PlayCard类。我有PlayCard的实例c。现在:
>>> print(c)
<__main__.Card object at 0x01FD5D30>

但是我想要的是类似于:

>>> print(c)
A♣

如何自定义Python类实例的字符串表示形式?

我正在使用Python 3.x。

2个回答

395

Java中最接近toString的方法是在你的类中实现__str__方法。将其放在类定义中:

def __str__(self):
     return "foo"

你可能还希望实现 __repr__ 来帮助调试。

更多信息请参见此处:


哇,那是一个相当老的文档版本 ;) s/release\/2.5.2\// - user395760
OP说他正在使用Python 3,不需要子类化对象。 - Senthil Kumaran
2
Dude repr 解析 - Alvaro Silvino

47

这并不像看起来那么简单,当仅覆盖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/


3
我不认为会有任何'a'的输出。JSON序列化不会查看函数,只会查看属性,而类A没有包含任何属性,只有三个函数。JSON转储将对象视为字典,并将所有键转换为字符串。 - mchicago
1
我不太确定你为什么要混合使用“to string”和json.dumps,它们是两个完全不同的东西。 - Jeppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接