python自定义类运算符重载

时间:2013-08-13 13:27:57

标签: python class oop operator-overloading

假设我有一个班级:

class Cat:
    def __init__(self, name = "default", age = 0):
        self.name = name
        self.age = age

我还有一张猫的名单:

l = [Cat('Joe')]

现在我不能打电话给以下人员:

if 'Joe' in l: # the right syntax would be if Cat('Joe') in list

我需要重载哪个运算符才能使identify类Cat by对象的成员变量为name

2 个答案:

答案 0 :(得分:5)

您必须定义__eq__方法,如下所示:

class Cat:

    def __init__(self, name = "default", age = 0):
        self.name = name
        self.age = age

    def __eq__(self, other):
        if isinstance(other, str):
            return self.name == other
        elif isinstance(other, Cat):
            return self.name == other.name

这样当你运行支票时:

l = [Cat('Joe')]

'Joe' in l
#True

答案 1 :(得分:2)

__contains__对象上的{p> list是通过检查相等性来实现的,因此覆盖__eq__

class Cat:
    def __init__(self, name = "default", age = 0):
        self.name = name
        self.age = age
    def __eq__(self, other):
        return self.name == other

这与订单无关,因为当左侧不支持操作时,相等性检查会交换其参数。

如果您希望它与基于散列的容器一起使用(例如setdict),您还必须覆盖__hash__

    def __hash__(self):
        return hash(self.name)