如何在Google App Engine数据模型中覆盖equals()方法?

11

我正在使用Google App Engine的Python库。如何覆盖类上的equals()方法,以便它根据以下类的user_id字段判断相等性:

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)

现在,我正在通过获取“UserAccount”对象并执行“user1.user_id == user2.user_id”来进行相等性判断。是否有一种方法可以覆盖它,以便'user1 == user2'仅查看'user_id'字段?

提前感谢。

1个回答

14

重载运算符 __eq__ (==)和 __ne__ (!=)。

例如:

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

你不应该需要覆盖__ne__方法 - 默认实现会调用__eq__方法。另外,从内置方法中返回一个异常类?这是什么鬼?抛出它! - Nick Johnson
3
@Nick Johnson,抱歉但你两次都是错误的,NotImplemented不是异常,请阅读http://docs.python.org/library/constants.html#NotImplemented 并尝试删除__ne__以及print UserAccount() == UserAccount(), UserAccount() != UserAccount(),输出结果将会是True True :) - Anurag Uniyal
@Nick Johnson,同时https://dev59.com/bXNA5IYBdhLWcg3wpvpg解释了为什么使用NotImplemented而不是NotImplementedError。 - Anurag Uniyal
3
道歉。你在两个问题上都是完全正确的,而我则错误了。至少我学到了一些新东西! :) - Nick Johnson
谢谢你们俩,你们真是帮了大忙。 - Cuga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接