Python 3中numbers.Integral与内置int的关系是什么

3 投票
1 回答
1048 浏览
提问于 2025-04-16 07:37

我刚开始学习Python,对numbers模块里的Integral和int之间的关系有点困惑。

我有几个问题:

  1. numbers.Integral和int之间是什么关系?这和Java里的Integer和int的关系类似吗?(Integer只是int的一个包装类)

  2. 什么时候应该使用numbers.Integral?因为numbers模块里定义的类型都不能被实例化,那我们在什么情况下需要用到这些类型呢?

我知道的唯一一个可以用Integral的情况是:

 # check if x is a integer
 isinstance(x, Integral)

根据Python语言参考文档:

" numbers.Number 这些是通过数字字面量创建的,并且通过算术运算符和算术内置函数返回的结果。 "

但似乎算术运算符或算术内置函数并没有返回numbers里的类型,它们返回的还是builtins里的类型。

>>> a,b=123,5
>>> c=a*b
>>> print(c.__class__)
<class 'int'>
>>> d=abs(a)
>>> print(d.__class__)
<class 'int'>

我使用的是Python 3.2a3。

1 个回答

3

听起来你对Java有一定了解:numbers.Integral定义了一个“接口”(其实它是接口的一种扩展,叫做“抽象基类”)。这个接口是用来表示整数的,但它并不是一个具体的类型,所以你不能直接用它来创建对象。

唯一一个实现这个接口的内置类型是int

你可以用isinstance( obj, numbers.Integral)来检查obj是否实现了这个接口:

>>> isinstance(3, numbers.Integral)
True
>>> isinstance(3.0, numbers.Integral)
False
>>> isinstance(3+0j, numbers.Integral)
False

如果你想写一个自定义的类,让它表现得像一个整数,你可以从numbers.Integral继承;或者如果你想创造一种新的数字类型,你也可以在这里注册它。

撰写回答