Python 3类属性集包含==dupli

2024-09-27 02:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类“Plan”,它有一个属性“edges”,这是一个集合。你知道吗

例如:

Plan.edges

Out:
{Edge literal-b851-True-bel --0--> strut-23-b495,
 Edge strut-23-b495 --effect-of--> literal-8b06-True-at,
 Edge cam-step-shot-24-8734 --effect-of--> literal-b851-True-bel,
 Edge strut-23-b495 --effect-of--> literal-8b06-True-at}

每个边都有一个源节点、一个字符串标签和一个汇节点。 我看了一个复制品,感到很困惑,就让

edges = list(Plan.edges)

Out:
[Edge literal-b851-True-bel --0--> strut-23-b495,
 Edge strut-23-b495 --effect-of--> literal-8b06-True-at,
 Edge cam-step-shot-24-8734 --effect-of--> literal-b851-True-bel,
 Edge strut-23-b495 --effect-of--> literal-8b06-True-at]

并询问

edges[1] == edges[3]

Out:
True

我的理解是,==操作符是复制的标准(我已经使用uueq\uuuhook定制了这个标准)。我已经通过==操作符检查了源节点和汇节点是否相等。我还检查了从集合中弹出它们,==操作符仍然发现边是相等的。一个简单的修复是Plan.edges = set(list(Plan.edges)) (这提供了期望的结果)但是我计划运行这个程序超过一百万次,所以我不希望添加不必要的代码,特别是当我不了解问题的根本原因时。你知道吗

Edge.__eq__(e2, e4)
Edge.__eq__(e4, e2)
e2.__eq__(e4)
e4.__eq__(e2)
e2 == e4
e4 == e2

一切都是真的。你知道吗

我的问题是,这怎么可能,我能做些什么来防止这种情况?我正在运行python3.3.2。事先谢谢你的帮助。你知道吗

。。。类内边缘

class Edge:
__slots__ = 'source', 'sink', 'label'
def __init__(self, source, sink, label):
    self.source=  source
    self.sink = sink
    self.label = label

def __eq__(self, other):
        if other is None:
            return False
        if self.source.ID == other.source.ID and self.sink.ID == other.sink.ID and self.label == other.label:
            return True
        return False

    def __ne__(self, other):
        return (not self.__eq__(other))

    def __hash__(self):
        return hash(self.source.ID) ^ hash(self.sink.ID) ^ hash(self.label)

Tags: ofselftruesourcelabeleqothereffect

热门问题