【问题标题】:What's the relationship between numbers.Integral and int in builtins module in Python 3Python 3中内置模块中的numbers.Integral和int之间的关系是什么
【发布时间】:2010-11-26 01:23:37
【问题描述】:

我是Python的新手,我对内置模块中numbers.Integral和int之间的关系有点困惑。

那么我的问题是:

  1. numbers.Integral 和 int 有什么关系?是不是跟Java中Integer和int的关系类似(Integer只是int的一个包装类)?

  2. 何时使用 numbers.Integral? 既然mumbers模块中定义的类型都不能被实例化,那么在什么样的场景下我们需要使用这些类型呢?

我知道只有一种情况可以使用 Integral:

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

来自 Python 语言参考:

" numbers.Number 这些由数字文字创建并返回为 算术运算符的结果和 算术内置函数。 "

但似乎算术运算符或算术内置函数不返回数字类型。它仍然是 builtins 中的类型。

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

我正在使用 Python 3.2a3。

【问题讨论】:

  • 顺便说一句,如果您是 python 新手,最好使用 Python 的官方版本,而不是 alpha 版本。
  • 非常感谢您的建议。由于我是一名经验丰富的程序员,我想我可以应付。
  • numbers.py中有一行:Integral.register(int),那么int是Integral的子类。

标签: python python-3.x


【解决方案1】:

既然您听起来像您了解 Java:numbers.Integral 为整数定义了“接口”(它实际上是接口的泛化,称为“抽象基类”(ABC))。它不是您可以实例化的具体类型。

实现此接口的唯一内置类型是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 继承——或者如果您想发明一种新类型的数字,您可以在那里注册。

【讨论】:

  • 那我能不能把int看作numbers.Integral的实现,因为后者是一个接口?我如何以及在哪里可以验证这种关系?非常感谢。
  • "实现该接口的唯一内置类型是 int。" 应该是 int 和 bool。
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 2015-06-10
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多