假设我有一个班级:
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
?
答案 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
这与订单无关,因为当左侧不支持操作时,相等性检查会交换其参数。
如果您希望它与基于散列的容器一起使用(例如set
,dict
),您还必须覆盖__hash__
:
def __hash__(self):
return hash(self.name)