объект к строке в 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 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 (в основном, чтобы также углубиться также для элементов в списке (или set или dict ...).
Для print (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 (они могут быть списками, но также и наборами, словарями и т. д.) было бы неплохо иметь простое и элегантное решение, которое не было бы требуется проверка типа ...
Возможно ли это ?
2 ответов:
Вы можете использовать
__repr__вместо__str__, который работает рекурсивно, хотя это не очень хорошая идея в большинстве случаев (посмотрите на Этот ответ для получения более подробной информации). Тем не менее, это работает для меня:def __repr__(self): return str(self.__dict__)
Вы можете попробовать использовать repr вместо str.
Я получил нижеприведенный вывод для print (t1), при использовании def repr(self): вместо str.
{'attr1': 'bean 1', 'attr2': [{'attr1': 'bean 1.1', 'attr2': 'same'}, {'attr1': 'bean 1.2', 'attr2': 42}]}
Дайте мне знать, если это решит вашу проблему. Прикрепление изображения Для справки.
С уважением, Винит
Comments