为什么"isinstance(numpy.float64,numbers.Real)"返回False?

Ale*_*int 1 python numpy

在numpy 1.8.0,python 2.7.6下,我尝试运行以下代码:

>>> isinstance(numpy.float64, numbers.Real)
False
Run Code Online (Sandbox Code Playgroud)

我的理解是数字模块应该是一种通用的方法来对具有类似数字功能的对象进行分类.numpy.float64肯定有一个实数的语义,那么为什么没有选择用数字ABC注册numpy.float64的numpy开发人员呢?

我当然可以自己进行注册,但我只是想检查这个遗漏是否有充分的理由.

iCo*_*dez 6

您没有创建以下实例numpy.float64:

>>> import numpy  
>>> import numbers
>>> numpy.float64
<class 'numpy.float64'>
>>> numpy.float64()
0.0
>>> isinstance(numpy.float64, numbers.Real)
False
>>> isinstance(numpy.float64(), numbers.Real) # Notice the () after numpy.float64
True
>>>
Run Code Online (Sandbox Code Playgroud)

相反,您当前的代码只是检查numpy.float64类本身是否是一个实例numbers.Real.这永远不会成真.


请注意,对于任何数字类型,您都会获得相同的行为:

>>> import numbers
>>> isinstance(int, numbers.Real)
False
>>> isinstance(int(), numbers.Real)
True
>>> isinstance(float, numbers.Real)
False
>>> isinstance(float(), numbers.Real)
True
>>>
Run Code Online (Sandbox Code Playgroud)