Val*_*ian 13 python tostring python-3.x
我有一些数据对象,我想在其上实现一个字符串和等于深入的函数.
我实现了str和eq,虽然平等工作正常但我不能以同样的方式使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__
Run Code Online (Sandbox Code Playgroud)
当我跑:
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)
Run Code Online (Sandbox Code Playgroud)
我明白了:
{'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
Run Code Online (Sandbox Code Playgroud)
由于t1和t2包含相同的值,因此equals返回true(如预期的那样),而由于t3在列表中包含不同的值,因此结果为false(也是预期的).我想要的是对于字符串具有相同的行为(基本上也深入到列表中的元素(或set或dict ...)).
对于打印(t1)我想得到类似的东西:
{'attr2': ["{'attr2': 'same', 'attr1': 'bean 1.1'}", "{'attr2': 42, 'attr1': 'bean 1.2'}"], 'attr1': 'bean 1'}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,实际上是获得的:
Bean("bean 1", [Bean("bean 1.1", "same").__str__(), Bean("bean 1.2", 42).__str__()]).__str__
Run Code Online (Sandbox Code Playgroud)
由于我不知道属性attr1的类型,我的Bean对象中的attr2(它们可能是列表,但也有集合,字典等)是一个简单而优雅的解决方案,不需要类型检查...
这可能吗 ?
ale*_*its 28
您可以使用__repr__而不是__str__递归工作,虽然这在大多数时候都不是一个好主意(请查看此答案以获取更多详细信息).不过,这对我有用:
def __repr__(self):
return str(self.__dict__)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74923 次 |
| 最近记录: |