假设你有一个需求,就是判断两个字符串是否相同,这里要求不区分大小写
你可以定义一个Word类。然后直接添加一个equals方法来比较两个字符串是否一致,忽略大小写,代码如下:
class Word():
def __init__(self,text):
self.text = text
def equals(self,other_word):
return self.text.lower() == other_word.text.lower()
再创建三个字符串
f = Word('ha')
k = Word('Ha')
s=Word('jk')
那么我们可以直接调用equals方法进行比较
>> f.equals(k)
True
>> f.equals(s)
False
这里我们成功的在类中定义了equals方法实现了字符串的比较。
但是我们之前比较两个对象都是直接通过a==b,这样的方式进行比较的话是不是更加优雅呢
那么该怎么定义我们的类来实现这种方式呢?这个时候,我们就可以使用魔法方法__eq__了,
魔法方法__eq__
在Python 中,__eq__是用于实现“等于”(==)比较运算符的特殊方法。__eq__方法接受两个参数:self(对象本身)和other(要比较的另一个对象)。这个方法返回一个布尔值,表示两个对象是否相等。
Python在使用==运算符时,会自动调__eq__方法。
通过定义__eq__方法,你可以自定义对象的相等性逻辑,使得两个对象可以通过==运算符进行比较。
那么这里在自定义类的时候,我们重写__eq__魔法方法,以实现不区分大小写。
我们可以进行试试:
class Word():
def __init__(self,text):
self.text = text
def equals(self,other_word):
return self.text.lower() == other_word.text.lower()
def __eq__(self, other):
return self.text.lower() == other.text.lower()
我们验证一下:
f = Word('ha')
k = Word('Ha')
s=Word('jk')
>> f==k
True
>> f ==s
False
注意事项
- 类型检查:在__eq__方法中,我们使用isinstance进行类型检查,确保只比较相同类型的对象
- 性能考虑:__eq__方法的性能会直接影响到数据结构如集合(set)和字典(dict)的行为,因此要注意避免不必要的性能损失
为了确保比较的对象类型相同,我们需要对类型进行判断,代码如下:
class Word():
def __init__(self,text):
self.text = text
def equals(self,other_word):
return self.text.lower() == other_word.text.lower()
def __eq__(self, other):
if not isinstance(other,Word):
return NotImplemented
return self.text.lower() == other.text.lower()
和比较相关的魔法方法
在Python中,比较操作通常是通过比较运算符(如==、!=、<、>、<=、>=)实现的,这些运算符可以直接用于各种数据类型(如整数、浮点数、字符串等)的比较,除了上面的__eq__魔法方法,其他的比较运算符皆有对应的魔法方法:
方法名 | 使用 |
__ne__(self,other) | self != other |
__lt__(self,other) | self < other |
__gt__(self,other) | self > other |
__le__(self,other) | self <= other |
__ge__(self,other) | self >= other |