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

How do I change the string representation of a Python class?

本问题已经有最佳答案,请猛点这里访问。

在爪哇中,我可以重写我的类的EDCOX1×0的方法。然后Java的打印函数打印其EDCOX1 OR 0定义的对象的字符串表示形式。是否有一个Python相当于Java的EDCOX1?0?

例如,我有一个PlayCard类。我有一张扑克牌的实例C。现在:

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

但我想要的是:

1
2
>>> print(c)
A?

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

我用的是python 3.x


最接近Java的EDCOX1(0)的等价物是为您的类实现EDCOX1(1)。将其放入类定义中:

1
2
def __str__(self):
     return"foo"

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

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

  • 特殊方法名称-基本自定义


这并不像看起来那么简单,当只有str被覆盖时,一些核心库函数不能工作(用python 2.7检查),请参阅这个线程以获取示例如何使类JSON可序列化同样,试试这个

1
2
3
4
5
6
7
8
9
10
11
12
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)

生产

1
'""'

而不是

1
'"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/