5

假设我有一堂课:

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

我需要重载哪个运算符才能将identifyCat 类的对象作为by其成员变量name

4

2 回答 2

7

您必须定义__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
于 2013-08-13T13:34:38.140 回答
2

__contains__on listobjects 是通过检查是否相等来实现的,因此覆盖__eq__

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

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

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

    def __hash__(self):
        return hash(self.name)
于 2013-08-13T13:35:12.203 回答