如何更改 Python 类的字符串表示形式? [复制]

Posted

技术标签:

【中文标题】如何更改 Python 类的字符串表示形式? [复制]【英文标题】:How do I change the string representation of a Python class? [duplicate] 【发布时间】:2011-06-22 05:19:13 【问题描述】:

在 Java 中,我可以覆盖类的 toString() 方法。然后 Java 的 print 函数打印由其toString() 定义的对象的字符串表示形式。是否有与 Java 的toString() 等效的 Python?

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

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

但我想要的是这样的:

>>> print(c)
A♣

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

我正在使用 Python 3.x

【问题讨论】:

【参考方案1】:

与 Java 的 toString 最接近的等价物是为您的类实现 __str__。把它放在你的类定义中:

def __str__(self):
     return "foo"

您可能还想实现__repr__ 来帮助调试。

查看这里了解更多信息:

Special Method Names - Basic Customization

【讨论】:

哇,这是文档的一个相当旧的版本;)s/release\/2.5.2\// OP说他正在使用python 3。不需要子类化对象。 老兄 repr 解决【参考方案2】:

这并不像看起来那么容易,当只有 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/

【讨论】:

我认为不会有任何输出“a”。 Json序列化不看函数而是看属性,A类不包含任何属性,只有三个函数。 Json dumps 将对象视为字典,并将所有键转换为 strs。 我不太清楚你为什么要混合“to string”和json.dumps,这是两个完全不同的东西。

以上是关于如何更改 Python 类的字符串表示形式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正余弦函数的复指数表示

Python - 将日期的字符串表示形式转换为 ISO 8601

BigDecimal类的用法

在序列化时,我应该更改什么设置来获取枚举的int值而不是其字符串表示形式? [重复]

将List的String表示形式转换为Dictionary Python

复数的表示形式