2016-02-26 6 views
0

У меня есть класс, который выглядит примерно так:Сравнение двух объектов с вложенными списками как свойства

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 
    def __eq__(self, other): 
     return self.a == other.a and self.b == other.b 

Однако, в данном случае «с» может быть списком Фооса с «с» с, которая содержит список Фооса, бывшее что-то вроде:

[Foo(1,2), Foo(3,4,[Foo(5,6)])] 

Что такое хороший подход в работе с этим типом сравнения объектов, учитывая список структуру структуру/объект? Я предполагаю, что просто делать self.c == other.c недостаточно для этого.

+1

Почему вы думаете, что это проблема? Если вы сравниваете списки, Python будет сравнивать элементы в них, чтобы определить, являются ли они равными (при условии, что они имеют одинаковую длину, которая сначала проверяется). См. http://stackoverflow.com/q/29215418/3001761 – jonrsharpe

+0

Исправить ваш '__eq__', чтобы использовать' == 'вместо' = 'и включать сравнение' c'. –

+0

'return all (getattr (self, n) == getattr (other, n) для n in ('a', 'b', 'c'))' – Kupiakos

ответ

0

Закрепление вашего метод __eq__

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 
    def __eq__(self, other): 
     return self.a == other.a \ 
       and self.b == other.b and self.c == other.c 

a,b = Foo(2,3), Foo(5,6) 
c = Foo(1,2, [a,b]) 
d = Foo(1,2) 
e,f = Foo(2,3), Foo(5,6) 
g = Foo(1,2, [e,f]) 

print c == d #False 
print c == g #True 
-2

Обобщенное решение n атрибутов в Foo:

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 

    def __eq__(self, other): 
     for attr, value in self.__dict__.iteritems(): 
      if not value == getattr(other, attr): 
       return False 
     return True 


item1 = Foo(1, 2) 
item2 = Foo(3, 4, [Foo(5, 6)]) 
item3 = Foo(3, 4, [Foo(5, 6)]) 

print(item1 == item2) # False 
print(item3 == item2) # True 
+0

, вы также можете добавить проверку типов, чтобы избежать ложных срабатываний. 'if not self .__ class__ == other .__ class__: return False' –

+0

Не было, извините. –