overidding Pythons __eq__方法,isistance&eq mothods返回false

cyb*_*101 0 python oop

我是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)

程序返回:不等于.

aba*_*ert 5

你的第一个问题isinstance(self, other)不是问是否selfother兼容类型的两个实例,或者他们是否是相同的实例(如您的评论说),它是询问是否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操作员.