我在检查内置类型NotImplementedType时注意到一些奇怪的东西。

>>> from types import NotImplementedType
>>> issubclass(NotImplementedType, type)
False
>>> type(NotImplementedType)
<type 'type'>

这两件事怎么可能是真的?如何才能使NotImplementedType不是type的一个子类,但却从type派生?

最佳答案

类不是type的子类,包括types.NotImplementedTypetype是类的元类。
例如,自定义类和内置类型也不是type的子类:

>>> class Foo: pass
...
>>> issubclass(Foo, type)
False
>>> issubclass(int, type)
False

只有其他元类是type的子类;比如ABCMeta元类:
>>> from abc import ABCMeta
>>> issubclass(ABCMeta, type)
True

这类似于intance和类;实例不是它们类的子类;使用isinstance()
>>> issubclass(Foo(), Foo)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
>>> isinstance(Foo(), Foo)
True
>>> import types
>>> isinstance(types.NotImplementedType, type)
True

08-15 23:48