python中字符串是对象吗_Python中的字符串对象

我有一些数据对象,希望在这些对象上实现一个to字符串和一个深入的equals函数。

我实现了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__

当我跑步时:

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>, <__main__.bean object at>], 'attr1': 'bean 1'}

{'attr2': [<__main__.bean object at>, <__main__.bean object at>], 'attr1': 'bean 1'}

{'attr2': [<__main__.bean object at>, <__main__.bean object at>], '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__

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

这有可能吗?

你试过json.dumps(你的对象)吗?

如果对象在集合中而不是str中,则调用repr

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

def __repr__(self):

return str(self.__dict__)

@用户1006698 stackoverflow.com/help/someone-answers

你可以试着用repr代替str。

当使用def repr(self):而不是str时,我得到了下面的打印输出(T1)。

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

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

当做,维尼思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值