python自定义类运算符重载

python自定义类运算符重载,python,class,oop,operator-overloading,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 我需要重载哪个操作符才能通过其成员变量name识别

假设我有一门课:

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

我需要重载哪个操作符才能通过其成员变量name识别类别Cat
的对象?

您必须定义
\uuuu eq\uu
方法,如下所示:

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

\uuuuu包含
列表上的
对象是通过检查是否相等来实现的,因此覆盖
\uuuuuu 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
)一起使用,您还必须覆盖
\uuuuuuuuuuu散列

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

我猜是equal运算符,在这里可以检查另一个对象是否属于同一实例,并且它的name属性是否与当前对象的名称匹配:
\uuuueq_uuuuu(self,other):\todo检查其他对象是否为ame类型,以及名称是否与self匹配。name
定义了equality运算符的行为,==。对不起,我是一个C语言的人…OP也应该定义
\uuuuuuuuuuuuuu散列()
,这样它就可以与set/dict一起工作。看,对不起,这是什么意思?为什么需要那个if语句呢?@gen在本例中,
isinstance
检查
other
是字符串(
str
)还是另一个
Cat
,要告诉
\uuuu eq\uuuuu
在每种情况下应该做什么…我还有一个问题:如果我做以下操作:
对于l中的catname:print catname
它将打印什么类Cat的对象,或者只打印对象的名称?要打印对象,您可以定义为