isinstance 和 type的区别在于:
class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isinstance(B(), A) # returns True type(B()) == A # returns False
区别就是 对于subclass之类的 type无法满足需要
-------------------
和Python的new-style class有关。相关链接 http://www.python.org/doc/newstyle/
以下代码在Python2.5中执行:
>>> class A: ... pass ... >>> a = A() >>> class B: ... pass ... >>> b = B() >>> type(a) is type(b) True >>>
在old-style class中,任意instance的type
都是'instance'。所以绝对不能用type来判断其类型。
另外这个问题又与Python的思想有关,正常情况下不应该编写代码检查类型的,而应该直接假设被操作的instance具有你希望的属性,否则抛出异常。即使需要检查类型,也应该用isinstance
来判断,这样你期望类型的subclass
也能正常被处理(比如,一个函数需要处理Message
类型,那么它应该也能处理Message
的子类型MyMessage
,所以应该使用isinstance(arg,Message)
这样来判断而不是type(arg) == Message
来判断)
参考Duck Typing
http://en.wikipedia.org/wiki/Duck_typing
另外这个问题还与metaclass
有关,但是我实在想不起来在哪个地方会导致type()
返回的不是type
这个class的instance了