如何更改 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
在序列化时,我应该更改什么设置来获取枚举的int值而不是其字符串表示形式? [重复]