Python:为什么isinstance返回False,什么时候应该返回True?

时间:2012-05-14 11:50:13

标签: python isinstance

我目前正在使用pdb跟踪来解决这个问题

ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>

为什么会发生这种情况?

P上。 S. isinstance(var, type(var))按预期返回True

2 个答案:

答案 0 :(得分:16)

  1. 我只能猜测,但如果你在module

    class Type(object): pass
    var = Type()
    class Type(object): pass
    

    然后这两种类型看起来都像<class 'module.Type'>,但仍然不同。

    您可以使用

    进行检查
    print(id(Type), id(var.__class__))
    

    print(Type is var.__class__)
    

    请注意,这些比较适用于旧式和新式类。 对于新式课程,它们相当于print(Type is type(var))。 但旧式的课程并非如此。

  2. 另一个相当常见的陷阱是您使用

    调用此模块
    python -m module
    

    python module.py
    

    将其称为__main__模块。如果它以其真实名称导入到其他地方,则在该名称下也可以使用不同的名称空间。

  3. 另一个猜测可能是您正在使用ABCs或者让该课程采用__instancecheck__()方法。

答案 1 :(得分:1)

iPython中“自动重载”设置的用户可能会遇到这种情况。重新加载一个类时,它将成为具有完全相同名称的新类。旧类的实例不会更新其类型:

# After reloading the Role class

[ins] In [19]: y = Role()

[ins] In [20]: isinstance(x, Role)
Out[20]: False

[nav] In [21]: isinstance(y, Role)
Out[21]: True

[ins] In [22]: type(x)
Out[22]: myproject.auth.Role

[ins] In [23]: type(y)
Out[23]: myproject.auth.Role