Это на самом деле два вопроса:
Почему никогда не вызывается оператор членства (__contains__)?
Почему 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__ никогда не вызывается. Я хотел бы, чтобы он возвращал True, True, True, True.
Любая другая критика моего кода, конечно, приветствуется, так как я новичок в Python.
__contains__
вызывается, когда вы спрашиваете объект, есть ли в нем другой объект. Здесь вызывается метод__contains__
nodeList
иnodeSet
, а неNode
. - person Casey Kuball   schedule 23.03.2012__hash__
, если вы хотите, чтобыD in nodeSet
возвращало True. Кроме того, мы обычно не используем геттеры и сеттеры, если они не необходимы (что бывает относительно редко). - person DSM   schedule 23.03.2012