2010-06-19 31 views
11

Tôi đang sử dụng thư viện Python cho Google App Engine. Làm thế nào tôi có thể ghi đè lên các phương pháp equals() trên lớp để nó phán xét bình đẳng trên user_id lĩnh vực của lớp sau:Làm cách nào để ghi đè bằng() trong kiểu mô hình dữ liệu công cụ ứng dụng của 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) 

Ngay bây giờ, tôi đang làm equalty bằng cách nhận một đối tượng UserAccount và làm user1.user_id == user2.user_id. Có cách nào tôi có thể ghi đè nó để 'user1 == user2' sẽ chỉ xem các trường 'user_id'?

Cảm ơn trước

Trả lời

14

khai thác Override __eq__ (==) và __ne__ (! =)

ví dụ

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

Bạn không cần ghi đè __ne__ - triển khai mặc định, IIRC, cuộc gọi __eq__. Ngoài ra, trả về một lớp ngoại lệ từ một cuộc gọi đến một phương thức nội trang? WTF? Nâng nó! –

+3

@Nick Johnson, xin lỗi nhưng bạn bị SAI trong cả hai trường hợp, NotImplemented không phải là ngoại lệ được đọc http://docs.python.org/library/constants.html#NotImplemented và thử xóa '__ne__' và' print UserAccount() == UserAccount(), UserAccount()! = UserAccount() 'in' True True' :) –

+0

@Nick Johnson, cũng http://stackoverflow.com/questions/878943/why-return-notimplmented-instead-of-raising- notimplementederror giải thích tại sao NotImplemented thay vì NotImplementedError –

Các vấn đề liên quan