如何更改Python类的字符串表示?
在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__
,这对调试会有帮助。
想了解更多信息,可以查看这里: