evg*_*iuz 17 python isinstance
我目前在pdb trace中想出这个
ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
PS 按预期isinstance(var, type(var))返回True
glg*_*lgl 18
我只能猜测,但如果你这样做的话 module
class Type(object): pass
var = Type()
class Type(object): pass
Run Code Online (Sandbox Code Playgroud)
然后这两种类型看起来都像<class 'module.Type'>,但仍然不同.
你可以检查一下
print(id(Type), id(var.__class__))
Run Code Online (Sandbox Code Playgroud)
或者
print(Type is var.__class__)
Run Code Online (Sandbox Code Playgroud)
请注意,这些比较适用于旧式和新式类.对于新式课程,它们相当于print(Type is type(var)).但旧式的课程并非如此.
另一个相当常见的陷阱是你用这个模块调用
python -m module
Run Code Online (Sandbox Code Playgroud)
要么
python module.py
Run Code Online (Sandbox Code Playgroud)
将其称为__main__模块.如果它以其真实名称导入到其他地方,则在该名称下也可以使用不同的名称空间.
另一个猜测可能是你正在使用ABCs或者让类有一个__instancecheck__()方法.
iPython 中“autoreload”设置的用户可能会遇到这个问题。当一个类被重新加载时,它将成为一个具有完全相同名称的新类。旧类的实例不会更新它们的类型:
# 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10258 次 |
| 最近记录: |