Python中的对象到字符串

2024-05-23 22:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据对象,我想在这些对象上实现一个to字符串和equals函数,这些函数可以深入研究。

我实现了streq虽然equality工作得很好,但我不能让str以同样的方式工作:

class Bean(object):

    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2

    def __str__(self):
        return str(self.__dict__)

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

当我跑步时:

t1 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t2 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t3 = Bean("bean 1", [Bean("bean 1.1", "different"), Bean("bean 1.2", 42)])

print(t1)
print(t2)
print(t3)
print(t1 == t2)
print(t1 == t3)

我得到:

{'attr2': [<__main__.Bean object at 0x7fc092030f28>, <__main__.Bean object at 0x7fc092030f60>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc091faa588>, <__main__.Bean object at 0x7fc092045128>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc0920355c0>, <__main__.Bean object at 0x7fc092035668>], 'attr1': 'bean 1'}
True
False

由于t1和t2包含相同的值,因此equals返回true(如预期),而由于t3在列表中包含不同的值,因此结果为false(如预期)。 我想要的是对to字符串有相同的行为(基本上对list(或set或dict…)中的元素也要深入研究)。

对于打印(t1),我想获得如下信息:

{'attr2': ["{'attr2': 'same', 'attr1': 'bean 1.1'}", "{'attr2': 42, 'attr1': 'bean 1.2'}"], 'attr1': 'bean 1'}

如果我这样做的话,这实际上是得到的:

Bean("bean 1", [Bean("bean 1.1", "same").__str__(), Bean("bean 1.2", 42).__str__()]).__str__

由于我不知道属性attr1和attr2在Bean对象中的类型(它们可能是列表,也可能是集合、字典等),所以最好有一个简单而优雅的解决方案,不需要类型检查。。。

这可能吗?


Tags: selfobjectmaindictatsamet1t3
2条回答

您可以尝试使用repr而不是str。

当使用defrepr(self)而不是str时,我得到了下面的打印输出(t1)

{'attr1':'bean 1','attr2':[{'attr1':'bean 1.1','attr2':'same'},{'attr1':'bean 1.2','attr2':42}}

如果这能解决你的问题,请告诉我。附加image以供参考。

谨致问候, 维尼思

您可以使用__repr__而不是__str__,后者以递归方式工作,尽管这在大多数情况下不是一个好主意(请查看this答案了解更多详细信息)。不过,这对我很有用:

def __repr__(self):
    return str(self.__dict__)

相关问题 更多 >