python numbers.integral 与 int 的区别

想理解一下 python 的数类型,但是现在搞不清 int 与 numbers.integral 到底什么关系?貌似前者是后者的一个子类,然而 inspect.getmro(int) 只显示 int 是 object 的子类而已,求大神解读?

isinstance(1,int)
Out[30]: True

isinstance(1,numbers.Integral)
Out[31]: True

inspect.getmro(int)
Out[32]: (int, object)

inspect.getmro(numbers.Integral)
Out[33]: 
(numbers.Integral,
 numbers.Rational,
 numbers.Real,
 numbers.Complex,
 numbers.Number,
 object)

issubclass(int,numbers.Integral)
Out[34]: True
阅读 6.1k
1 个回答

numbers.Integral 是一个 ABC(Abstract Base Class),ABC 的子类不需要直接继承 ABC,而只要调用 ABC.register(SubClassOfABC) 就能表示一种继承关系,并被 issubclass()isinstance() 等方法识别。此外,ABC 不能直接实例化:

>>> numbers.Integral()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Integral

使用 numbers.Integral 来判断整型可以识别 numpy.int64、Python 2 中的 longint 以外的整数类型:

>>> isinstance(0L, int)
False
>>> isinstance(0L, numbers.Integral)
True
>>> isinstance(numpy.int64(), int)
False
>>> isinstance(numpy.int64(), numbers.Integral)
True
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏