HOWTO · Python
Python 中的 __eq__ 方法
本教程展示了如何在 Python 中学习 Eq 方法
本页内容
本指南将展示我们如何在 Python 中处理 __eq__() 方法。我们将组合不同的对象并学习这种特定方法的功能。让我们深入了解它。
Python 中的 __eq__()
首先,__eq__() 是一个 dunder/magic 方法,如你所见,它前面和后面都有双下划线。每当你使用 == 运算符时,都会调用此方法来比较两个类实例。如果你没有为 __eq__() 方法提供特定实现,Python 将使用 is 运算符进行比较。但是你如何指定这个方法呢?答案在于覆盖这个函数。看看下面的代码。
# __eq__ this is called dunder/magic method in python
# class of student has constructor with two arguments
class Student:
def __init__(self, name, roll):
self.name = name
self.roll = roll
# object one of class student
s1 = Student("David", 293)
# object two of class student
s2 = Student("David", 293)
# Applying equality function two objects
print(s1 == s2)
输出:
False
如你所见,我们创建了一个名为 Student 的类,并将其两个参数设置为 name 和 roll。后来,你创建了两个具有相同 Student 类数据的实例。正如我们在上面的代码中所做的那样比较这两个实例将给出一个 false 输出。
尽管这些实例具有相同的数据,但它们在比较后并不相等。这是因为 == 运算符比较了 case 的地址,这是不同的。你可以通过运行以下代码和上面的代码来看到这一点。
# Both objects have different ids thats why the s1==s2 is false
print(id(s1))
print(id(s2))
输出:
1991016021344 //(it will vary)
1991021345808 //(it will vary)
但是,如果我们要创建一个实例,然后在另一个示例中保存该实例,如下所示,它们的地址将是相同的。看一看。
# object one of class student
s1 = Student("Ahsan", 293)
s3 = s1
# In this case we have same id for s1 and s3
print(s1 == s3)
print(id(s1))
print(id(s3))
输出:
True
1913894976432 //(it will vary)
1913894976432 //(it will vary)
它会给你 true 作为输出。那么,我们如何根据数据比较两个实例呢?我们需要实现 dunder 方法并像下面这样覆盖它。
# class of student has constructor with two arguments and a modified dunder method of __eq__
class Student:
def __init__(self, name, roll):
self.name = name
self.roll = roll
# implementing the dunder method
def __eq__(self, obj):
# checking both objects of same class
if isinstance(obj, Student):
if self.roll == obj.roll:
return True
else:
return False
# object of class student
s4 = Student("David", 293)
# other object of class student
s5 = Student("David", 293)
# Applying equality function two objects
print(s4 == s5)
# Both objects have different ids, but the s4==s5 is true because we override the __eq__ function it will give true when the roll number is some
print(id(s4))
print(id(s5))
# object of class student
s6 = Student("David", 293)
# other object of class student
s7 = Student("David", 178)
# Applying equality function two objects will give us False because the roll is different
print(s6 == s7)
输出:
True
1935568125136 //(it will vary)
1935568124656 //(it will vary)
False
现在,我们通过在里面放置一个检查 roll 是否相同的 if 条件来覆盖 __eq__() 方法。这就是你在 Python 中覆盖 __eq__() 方法的方式。