gpt4 book ai didi

python - isinstance() 的行为不符合我的预期

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:35 26 4
gpt4 key购买 nike

我有一个我写的类,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。

new_road、e0 和 e1 都返回它们的类是“my_graph.MyEdge”,所以看起来 isinstance(new_road,my_graph.MyEdge) 应该是真的。

为什么 isinstance 以不同的方式对待 e1 和 new_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)

最佳答案

也许你在创建 new_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 应该相同。

关于python - isinstance() 的行为不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com