Python - isinstance() 没有像我期望的那样工作

W. *_*kin 8 python python-2.7

我有一个名为 Route 的类(带有自己的 __repr__() 函数)和一个名为 default_route 的 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
Run Code Online (Sandbox Code Playgroud)

类定义非常简单和简单:

class Route(object):
    def __init__(self, phone, condition=None):
        self.phone=phone
        self.condition=condition
        self.choice_name=None
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 5

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

  1. import routedefault_route使用创建route.Route
  2. 调用reload(route)以将一些代码更改引入模块(或只是为了好玩;如果模块未更改也没关系,reload仍然会重新加载它)

如果default_route也在 中定义route,您可能会以类似的方式遇到这种情况,并且您做了from route import Route,然后reload-ed route,然后做了from route import default_route(导入的顺序Routedefault_route是无关紧要的,只要reload它们之间发生了,并且没有重新导入旧的)。无论哪种方式,您都有一个实例和一个来自模块的不同版本的类;它们可能看起来相同,具有相同的行为等,但它们不是相同的模块,因此也不是相同的类、实例等。

在任何一种情况下,快速检查都是调用default_route.__class__ is Route; 如果计算结果为True,有可能你已经有了一些奇怪的ABC基于类的一个破碎的__subclasshook__,但更可能会评估到False,这表明两个班,尽管匹配的名字,实际上是从模块的独立负载起源。

  • @OlivierMelançon:在没有注意到的情况下使用`reload`:很难。不理解“重新加载”的含义并将其从“不相关”的问题中省略?简单。在我参与或教授的每门 Python 入门课程中,在“实时”开发模块时所犯的*极端* 常见错误之一是创建一个类的实例,“重新加载”它来自的模块,然后想知道为什么对模块的更改似乎没有应用,或者为什么新创建的实例不能与旧实例一起正常工作(通常是由于运算符重载中的 `isinstance` 检查)。 (2认同)