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

sna*_*ile 198 python printing string python-3.x

在Java中,我可以覆盖toString()我的类的方法.然后Java的print函数打印由其定义的对象的字符串表示toString().有没有相当于Java的Python toString()

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

>>> print(c)
<__main__.Card object at 0x01FD5D30>
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

>>> print(c)
A?
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Python 3.x.

Mar*_*ers 255

与Java最接近的toString__str__为您的类实现.把它放在你的类定义中:

def __str__(self):
     return "foo"
Run Code Online (Sandbox Code Playgroud)

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

浏览此处获取更多信息:

  • 兄弟 __repr__ 解决 (2认同)

see*_*eeg 32

这并不像看起来那么容易,一些核心库函数在只覆盖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)
Run Code Online (Sandbox Code Playgroud)

产生

'""'
Run Code Online (Sandbox Code Playgroud)

并不是

'"a"'
Run Code Online (Sandbox Code Playgroud)

正如所料.

编辑:回答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/

  • 我不认为'a'的任何输出都是预料之中的.Json序列化不是看函数,而是属性和类A不包含任何属性,只有三个函数.Json转储将对象视为字典,并将所有键转换为strs. (3认同)