2010-06-19 13 views
11

Używam bibliotek Pythona do Google App Engine. W jaki sposób można zastąpić metodę equals() w klasie tak, kiedy uzna, równość w dziedzinie następnej klasy user_id:Jak zastąpić equals() w modelu modelu danych silnika wyszukiwarki Google?

class UserAccount(db.Model): 
    # compare all equality tests on user_id 
    user = db.UserProperty(required=True) 
    user_id = db.StringProperty(required=True) 
    first_name = db.StringProperty() 
    last_name = db.StringProperty() 
    notifications = db.ListProperty(db.Key) 

Teraz robię equalty przez coraz UserAccount obiekt i robi user1.user_id == user2.user_id. Czy istnieje sposób, w jaki mogę go przesłonić, aby "user1 == user2" wyświetlał tylko pola "user_id"?

góry dzięki

Odpowiedz

14

operatorzy Zastąp __eq__ (==) i __ne__ (! =)

np

class UserAccount(db.Model): 

    def __eq__(self, other): 
     if isinstance(other, UserAccount): 
      return self.user_id == other.user_id 
     return NotImplemented 

    def __ne__(self, other): 
     result = self.__eq__(other) 
     if result is NotImplemented: 
      return result 
     return not result 
+0

Nie należy zastępować __ne__ - domyślnej implementacji, IIRC, połączeń __eq__. Zwracasz także klasę wyjątków z wywołania wbudowanej metody? WTF? Podnieś to! –

+3

@Nick Johnson, przepraszam, ale jesteś NIEPRAWIDŁOWY w obu przypadkach, NotImplemented nie jest wyjątkiem odczytywanym http://docs.python.org/library/constants.html#NotImplementowany i spróbuj usunąć '__ne__' i' print UserAccount() == UserAccount(), UserAccount()! = UserAccount() 'drukuje' True True' :) –

+0

@Nick Johnson, również http://stackoverflow.com/questions/878943/why-return-notimmented-instead-of-raising- notimplementederror wyjaśnia, dlaczego nie wykonano polecenia zamiast ImumInformedError –

Powiązane problemy