0

我是来自 Java 世界的 Python 新手。

我编写了一个名为“Instance”的 Python 类,它具有 3 个属性(属性、值和类)。我想覆盖“ eq ”方法和“ hash ”方法,我正在使用用于对象比较的“attribute”和“value”属性。我用相同的值实例化了两个对象,但是它们返回不相等。

代码如下,类实例:

'''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)

我正在实例化另一个名为 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"

程序返回:不等于。

4

1 回答 1

5

您的第一个问题isinstance(self, other)不是询问是否self并且other都是兼容类型的实例,或者它们是否是同一个实例(如您的评论所说),而是询问是否self是 type 的实例other。因为other甚至不是类型,所以答案总是错误的。

你可能想要isinstance(self, type(other)). 或者可能是更复杂的东西,比如isinstance(self, type(other)) or isinstance(other, type(self)).

或者也许你根本不想要这个;即使对于相等性测试,duck typing 通常也是一个好主意。如果other具有与 相同的属性self,并且散列到相同的值,那是否足够好?答案可能是否定的……但你绝对应该问这个问题。


你的第二个问题是误解is

if (instance1 is instance2):
    print "equals"
else:
    print "not equals"

的全部意义is在于它询问这些是否是同一个对象,而不是这两个(可能不同的)对象是否彼此相等。例如:

>>> a = []
>>> b = []
>>> a == b
True
>>> a is b
False

它们都是空列表,因此它们彼此相等,但它们是两个不同的空列表,这就是您可以这样做的原因:

>>> a.append(0)
>>> b
[]

你的班级也是如此。您创建的每个Instance实例都将是一个不同的、单独的实例——即使它们都是相同的。

__eq__您定义的方法自定义了==运算符。无法自定义is运算符。

于 2013-07-12T23:28:59.000 回答