如何在Python类中使用等价(”相等”)运算符?
使用比较运算符,我们可以在Python中比较各种数据类型。但是,在创建自定义类时,我们无法使用比较运算符简单地进行比较。
本文将介绍验证Python类中等价性(”相等”)的不同方法。
更多Python相关文章,请阅读:Python 教程
类对象的相等性
==
运算符使确定两个内置对象(如字符串或整数)是否相等变得简单。下面的示例证明了这一点。
示例
以下是==
运算符的示例 –
char1 = 365
char2 = 83
result = char1 == char2
print("{}和{}相等:{}".format(char1, char2, result))
输出
以下是上面代码的输出 –
365和83相等:False
注意 - 因为数字365和83都是整数,所以==
运算符在这种情况下返回正确的结果。但是,Python解释器在处理来自唯一类的对象时行为有所不同。
示例
假设 Square 类只有一个属性 square ,如下所示 –
class Square:
def __init__(self, area):
self.square = area
print('equal')
输出
以下是上面代码的输出 –
equal
现在 , Square 类的两个实例 Square 将被设置为相同的面积。
示例
class Square:
def __init__(self, area):
self.square = area
sq1 = Square(23)
sq2 = Square(23)
print('equal')
输出
以下是上面代码的输出 –
equal
注意 - 即使两个实例的 square 属性相同,使用 运算符比较对象的结果也会是 False 。这在下面的代码中说明-
示例
class Square:
def __init__(self, area):
self.square = area
sq1 = Square(23)
sq2 = Square(23)
result = sq1 == sq2
print('sq1和sq2相等:',result)
输出
以下是上面代码的输出 –
sq1和sq2相等: False
注意 ‚Python解释器比较两个用户定义类的对象的方式可以用来解释上述行为。当我们使用Python的==
运算符比较两个类对象的相等性时,只有两个对象指向相同的内存地址时,结果才会为True。
换句话说,只会有一个Python对象和两个变量。这可以在以下示例中看到 ‚
示例
class Square:
def __init__(self, area):
self.square = area
sq1 = Square(23)
sq2 = sq1
result = sq1 == sq2
print ('sq1 and sq2 are equal:',result)
输出
下面是上述代码的输出结果 ‚
sq1 and sq2 are equal: True
现在清楚了,只有两个变量与用户定义的类的同一实例有关系时,等号操作符才会返回True。
使用eq()方法进行相等性比较
我们可以通过覆盖__eq__()
方法来调整与自定义类相关的等号操作符的行为。例如,我们可以重写__eq__()
函数以比较Square类两个实例的平方。
在__eq__()
方法中,将采用以下程序 ‚
- 当用于Square类实例时,
__eq__()
方法将接受一个额外的对象作为输入参数。 - 我们将在
__eq__()
方法内部首先确定输入对象是否是Square类的实例。在这种情况下,可以使用isinstance()函数。 - 实例化()函数的第一个和第二个输入参数是类名和Python对象。如果对象在执行后是指定输入参数中的类的实例,则返回True。
- 在我们的程序中,第二个输入参数将是Square类。如果第一个参数的对象不是Square类的实例,则它将返回False。
如果不是,我们将继续进行,
- 我们将比较两个对象中的属性平方面积,以确定两个对象是否属于同一类。如果面积相等,则结果为True。
如果不是,则返回False。
- 在将
__eq__()
方法添加到Square类后,我们可以适当比较两个Number类的实例使用==
运算符。 - 假设我们有两个Square类实例,让我们称它们为sq1和sq2。当
sq1==sq2
时,应用sq1.__eq__(sq2)
函数。 - 类似地,当我们进行
sq2==sq1
时,将执行sq2.__eq__(sq1)
方法。 - 在执行代码时,如果两个对象的平方面积相等,则
sq1==sq2
将返回True。如果不是,则返回False。
我们可以在以下示例中观察到它 ‚
示例
class Square:
def __init__(self, area):
self.square = area
def __eq__(self, other):
isSquare = isinstance(other, self.__class__)
if not isSquare:
return False
if self.square == other.square:
return True
else:
return False
sq1 = Square(23)
sq2 = Square(23)
result = sq1 == sq2
print ('sq1 and sq2 are equal:',result)
输出
以上代码的输出结果如下 ‚
sq1 and sq2 are equal: True
根据id()方法进行相等判断
另外,您可以确定两个具有自定义类对象的变量是否与相同的对象有关。可以使用 id() 函数来进行判断。
可以通过使用 id() 函数,在内存的任何位置找到唯一的身份标识号码,该函数接受一个对象作为输入参数。
示例
以下是id()方法的例子 ‚
class Square:
def __init__(self, area):
self.square = area
def __eq__(self, other):
isSquare = isinstance(other, self.__class__)
if not isSquare:
return False
if self.square == other.square:
return True
else:
return False
sq1 = Square(23)
sq2 = Square(23)
result1 = id(sq1)
result2 = id(sq2)
print ('The sq1 id is:',result1)
print (
'The sq2 id is:',result2)
输出
以下是以上代码的输出结果 ‚
The sq1 id is: 2632227365088
The sq2 id is: 2632227365232
注意 ‚如果两个变量都引用同一内存地址,则 id() 函数将为两个对象返回相同的结果。我们可以按照下面的示例比较 id() 函数的输出,以确定两个对象是否引用相同的内存地址 ‚
示例
class Square:
def __init__(self, area):
self.square = area
def __eq__(self, other):
isSquare = isinstance(other, self.__class__)
if not isSquare:
return False
if self.square == other.square:
return True
else:
return False
sq1 = Square(23)
sq2 = Square(23)
result1 = id(sq1)
result2 = id(sq2)
result = result1 == result2
print ('sq1 and sq2 are equal:',result2)
输出
以下是上述代码的输出 ‚
sq1 and sq2 are equal: 2284484764016
如你所见,我们在这种情况下没有检查对象的区域属性是否相同以确定它们是否属于同一类。
在这种情况下,我们仅仅需要确定对象是否指向了相同的内存区域。因此,在类声明中使用 ==
运算符而不包括 __eq__()
函数同样等同于使用这种方式确定 Python 类的等价性。