isinstance()的行为与我的预期不符

2024-10-02 22:38:12 发布

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

我编写了一个类MyEdge(它存储两个节点,为一些图形成一条边),我正在努力找出isinstance行为不一致的原因。你知道吗

我有一个对象,newúroad,当我问它的时候,它认为它在MyEdge类中。 isinstance(new_road, my_graph.MyEdge)返回False。你知道吗

当我做一个指向它的指针e0 = new_road, isinstance(e0, my_graph.MyEdge)时,我也得到false,这至少是自一致的。你知道吗

当我复制时,e1 = my_graph.MyEdge(new_road.nodes), isinstance(e1,my_graph.MyEdge)返回true。你知道吗

新东路,e0和e1都返回他们的班级是'我的'_图形.MyEdge,所以看起来isinstance(new_road,my_graph.MyEdge)应该是真的。你知道吗

为什么iInstance对e1和new\u road1的处理方式不同?你知道吗

ipdb> new_road.__class__
<class 'my_graph.MyEdge'>

ipdb> e1 = my_graph.MyEdge(new_road.nodes)

ipdb> e1 is new_road
False

ipdb> e1 == new_road
True

ipdb> e1.__class__
<class 'my_graph.MyEdge'>

ipdb> new_road.__class__
<class 'my_graph.MyEdge'>

ipdb> isinstance(e1,my_graph.MyEdge)
True

ipdb> isinstance(new_road,my_graph.MyEdge)
False

ipdb> new_road1.__class__ is my_graph.MyEdge 
False

ipdb> e1.__class__ is my_graph.MyEdge 
True

我不知道它是否有用,但下面是MyEdge类的代码:

class MyEdge(object):
    """ keeps the properties of the edges in a parcel."""

    def __init__(self, nodes):
        self.nodes = tuple(nodes)
        self.parcel1 = None
        self.parcel2 = None
        self.road = False
        self.barrier = False

    @lazy_property
    def length(self):
        return mgh.distance(self.nodes[0], self.nodes[1])

    @lazy_property
    def rads(self):
        return math.atan((self.nodes[0].y - self.nodes[1].y) /
                         (self.nodes[0].x - self.nodes[1].x))

    def __repr__(self):
        return "MyEdge with nodes {} {}".format(self.nodes[0], self.nodes[1])

    def __eq__(self, other):
        return ((self.nodes[0] == other.nodes[0] and
                 self.nodes[1] == other.nodes[1]) or
                (self.nodes[0] == other.nodes[1] and
                 self.nodes[1] == other.nodes[0]))

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

    def __hash__(self):
        return hash(self.nodes)

Tags: selffalsenewreturnmydefclassgraph
1条回答
网友
1楼 · 发布于 2024-10-02 22:38:12

也许您可以在创建新的_road和e1之间重新加载/重新导入/覆盖类

In [1]: class C(object): pass
In [2]: a = C()
In [3]: class C(object): pass
In [4]: isinstance(a, C)
Out[4]: False

在本例中,两个C()实例的__class__看起来相同,但仍然不同。id()可能有帮助:

id(type(e1)), id(type(new_road)), id(my_graph.MyEdge)

所有ID都应该相同。你知道吗

相关问题 更多 >