object to string in Python
我有一些数据对象,希望在这些对象上实现一个to字符串和一个深入的equals函数。
我实现了str和eq,虽然相等很好,但我不能使str以同样的方式工作:
1 2 3 4 5 6 7 8 9 10 11 | 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__ |
当我跑步时:
1 2 3 4 5 6 7 8 9 | 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) |
号
我得到:
1 2 3 4 5 | {'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),我想获得如下内容:
1 | {'attr2': ["{'attr2': 'same', 'attr1': 'bean 1.1'}","{'attr2': 42, 'attr1': 'bean 1.2'}"], 'attr1': 'bean 1'} |
。
如果我这样做,就可以得到:
1 | Bean("bean 1", [Bean("bean 1.1","same").__str__(), Bean("bean 1.2", 42).__str__()]).__str__ |
因为我不知道bean对象中attr1、attr2属性的类型(它们可能是列表,也可能是集合、字典等),所以最好有一个简单而优雅的解决方案,不需要类型检查…
这有可能吗?
您可以使用
1 2 | def __repr__(self): return str(self.__dict__) |
你可以试着用repr代替str。
当使用def repr(self):而不是str时,我得到了下面的打印输出(T1)。
'attr1':'bean 1','attr2':['attr1':'bean 1.1','attr2':'same','attr1':'bean 1.2','attr2':42]
如果这能解决你的问题,请告诉我。附加图像以供参考。
当做,维尼思