Членство объекта в наборах - PullRequest
0 голосов
/ 23 марта 2012

Это действительно два вопроса:

  1. Почему оператор членства (__contains__) никогда не вызывается?

  2. Почему D в nodeList, а не в nodeSet?

Моя цель - чтобы D был "в" как nodeList, так и nodeSet, потому что он имеет тот же loc, что и A.

class Node(object):
    def __init__(self, loc):
        self.loc = loc

    def __eq__(self, other):
        print "eq: self.getLoc(): {}, other.getLoc(): {}".format(self.getLoc(),     other.getLoc())
        if self.getLoc() == other.getLoc():
            return True
        return False

    def __contains__(self, other):
        print "contains: self.getLoc(): {}, other.getLoc(): {}".format(self.getLoc(),  other.getLoc())
        if self.getLoc() == other.getLoc():

            return True
        return False

    def setLoc(self, loc):
        self.loc = loc

    def getLoc(self):
        return self.loc


if __name__ == "__main__":
    A = Node((1,1))
    B = Node((2,2))
    C = Node((3,3))

    D = Node((1,1))

    nodeList = [A, B, C]
    nodeSet = set()
    nodeSet.add(A)
    nodeSet.add(B)
    nodeSet.add(C)

    print "A in nodeList: {}".format(A in nodeList)
    print "A in nodeSet: {}".format(A in nodeSet)
    print "D in nodeList: {}".format(D in nodeList)
    print "D in nodeSet: {}".format(D in nodeSet)

Возвращает True, True, True, False. По-видимому, оператор __contains__ никогда не вызывается. Я хотел бы, чтобы он вернул Истину, Истину, Истину, Истину.

Любая другая критика моего кода, конечно, приветствуется, так как я новичок в Python.

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Почему бы Node.__contains__ когда-либо называться? У вас никогда не будет Node в качестве правой части выражения in.

0 голосов
/ 23 марта 2012

См. документацию __hash__() - вкратце:

[I] f [класс] определяет __cmp__() или __eq__(), но не __hash__(), его экземпляры не будут использоваться в хешированных коллекциях.

A set - это хэшированная коллекция. Вы хотите убедиться, что вы внедрили Node.__hash__()

...