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

时间:2011-02-06 10:56:32

标签: python string python-3.x printing

在Java中,我可以覆盖我班级的toString()方法。然后Java的print函数打印由其toString()定义的对象的字符串表示。是否有一个Python等同于Java的toString()

例如,我有一个PlayCard课程。我有一个PlayCard的实例c。现在:

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

但我想要的是:

>>> print(c)
A♣

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

我正在使用Python 3.x

2 个答案:

答案 0 :(得分:243)

与Java toString最接近的是为您的班级实施__str__。把它放在你的班级定义中:

def __str__(self):
     return "foo"

您可能还希望实施__repr__以帮助调试。

有关详细信息,请参阅此处:

答案 1 :(得分:31)

这并不像看起来那么简单,当只有 str 被覆盖时(使用Python 2.7检查),某些核心库函数不起作用,请参阅此主题以获取示例 How to make a class JSON serializable 另外,试试这个

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/