我是Java世界的新手.
我编写了一个名为"Instance"的Python类,它有3个属性(属性,值和类).我想覆盖" eq "方法以及" 哈希 "方法,我正在使用用于对象比较的"属性"和"值"属性.我实例化了两个具有相同值的对象,但它们返回不相等.
代码如下,类实例:
'''Class of type Instance'''
class Instance(object):
__attribute = None;
__value = None;
__classification = None;
#constructor
def __init__(self,attribute,value,classification):
self.attribute = attribute;
self.value = value;
self.classification = classification;
#setters & getters
def setAttribute(self,attribute):
self.attribute = attribute
def setValue(self,value):
self.value = value
def setClassification(self,classification):
self.classification = classification
def getAttribute(self):
return self.Attribute;
def getValue(self):
return self.Value
def getClassification(self):
return self.Classification
def __eq__(self, other):
#if self & other are the same instance & attribute & value equal
return isinstance(self,other) and (self.attribute == other.attribute) and (self.value == other.value)
def __hash__(self):
return hash(self.attribute, self.value)
Run Code Online (Sandbox Code Playgroud)
我正在实例化另一个名为Testing的Python模块:
if __name__ == '__main__':
pass
from Instance import *
instance1 = Instance('sameValue', 1,'Iris-setosa')
instance2 = Instance('sameValue', 1,'Iris-setosa')
if (instance1 is instance2):
print "equals"
else:
print "not equals"
Run Code Online (Sandbox Code Playgroud)
程序返回:不等于.
你的第一个问题isinstance(self, other)不是问是否self和other兼容类型的两个实例,或者他们是否是相同的实例(如您的评论说),它是询问是否self是该类型的一个实例other.由于other甚至不是一个类型,答案总是错误的.
你可能想要isinstance(self, type(other)).或许更复杂的事情,比如isinstance(self, type(other)) or isinstance(other, type(self)).
或许你真的不想要这个; 即使是平等测试,鸭子打字通常也是一个好主意.如果other具有相同的属性self,并且哈希值相同,那还不够好吗?答案可能不是......但你绝对应该问这个问题.
你的第二个问题是对以下方面的误解is:
if (instance1 is instance2):
print "equals"
else:
print "not equals"
Run Code Online (Sandbox Code Playgroud)
问题的关键is在于它询问这些是否是同一个对象,而不是这两个(可能是不同的)对象是否彼此相等.例如:
>>> a = []
>>> b = []
>>> a == b
True
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)
它们都是空列表,因此它们彼此相等,但它们是两个不同的空列表,这就是为什么你可以这样做的原因:
>>> a.append(0)
>>> b
[]
Run Code Online (Sandbox Code Playgroud)
你的班级也是如此.Instance你创建的每一个都将是一个不同的,独立的实例 - 即使它们都是平等的.
__eq__您定义的方法自定义==运算符.无法自定义is操作员.