Python 3中numbers.Integral与内置int的关系是什么
我刚开始学习Python,对numbers模块里的Integral和int之间的关系有点困惑。
我有几个问题:
numbers.Integral和int之间是什么关系?这和Java里的Integer和int的关系类似吗?(Integer只是int的一个包装类)
什么时候应该使用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
继承;或者如果你想创造一种新的数字类型,你也可以在这里注册它。