【问题标题】:How do I change the string representation of a Python class? [duplicate]如何更改 Python 类的字符串表示形式? [复制]
【发布时间】: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

【问题讨论】:

    标签: python string python-3.x printing


    【解决方案1】:

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

    def __str__(self):
         return "foo"
    

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

    查看这里了解更多信息:

    【讨论】:

    • 哇,这是文档的一个相当旧的版本;)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,这是两个完全不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多