Python isinstance()的工作方式与我的exp不同

2024-06-16 14:10:47 发布

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

我有一个名为Route的类(有它自己的uRepr_Uu()函数),还有一个名为default_Route的路由实例。但是,如果我调用isinstance(default_route,route),它意外地返回False,即:

[Dbg]>>> default_route
Route(office(235)=323-654-3242)
[Dbg]>>> isinstance(default_route,Route)
False
[Dbg]>>> default_route.__class__
<class 'route.Route'>
[Dbg]>>> Route
<class 'route.Route'>
[Dbg]>>> type(default_route)
<class 'route.Route'>
[Dbg]>>> type(default_route) is Route
False

类定义非常简单明了:

^{pr2}$

我对此感到困惑;为什么上面的isinstance()不能返回True?在


Tags: 实例函数falsedefault路由istyperoute
2条回答

如果您执行以下操作,则很容易发生这种情况:

  1. import route并使用route.Route创建{}
  2. 调用reload(route)将一些代码更改拉入模块(或者只是为了好玩;如果模块没有更改,reload仍将重新加载它)

如果default_routeroute中也定义了from route import Route,然后reload-edroute,那么{}(导入顺序Route和{}无关,只要reload发生在它们之间,而较早的一个不被重新导入)。不管是哪种方式,您都有一个实例和一个来自不同版本模块的类;它们可能看起来相同,具有相同的行为等,但它们不是同一个模块,因此也不是相同的类、实例等

无论哪种情况,快速检查都是调用default_route.__class__ is Route;如果结果是True,那么可能有一些奇怪的基于ABC的类,带有{a1},但更有可能的是它的计算结果是False,这表明尽管名称匹配,这两个类实际上都来自于模块的独立加载。在

我很确定这是我使用的调试器(Pythonwin)的问题;无论我在调试器的那个实例中重新加载和重新运行代码多少次,问题都是完全稳定的,而且,由于我正在调试我的代码,下一步该怎么办,我很困惑。但是,考虑到上面关于重新加载的一些评论,我开始怀疑调试环境本身可能有问题,所以我关闭了程序,重新打开它,突然问题就不再是可重现的了。在

很抱歉打扰了所有人,但至少如果有人看到同样的问题,也许这会让他们意识到他们不是疯了,Python本身并没有以某种微妙的方式被破坏!在

相关问题 更多 >