理解对象.__ flags__和ndarray .__ flags__

时间:2018-01-08 03:04:23

标签: python numpy oop multidimensional-array

object.__flags__的结果是什么意思?以及如何解释它?

In [55]: str.__flags__
Out[55]: 269227008

In [56]: list.__flags__
Out[56]: 34362368

In [57]: tuple.__flags__
Out[57]: 67916800

In [58]: object.__flags__
Out[58]: 791552

In [59]: ndarray.__flags__
Out[59]: 791552

另外,最重要的是,为什么我们为object.__flags__ndarray.__flags__获得相同的结果?

1 个答案:

答案 0 :(得分:2)

使用关联的SO:What does __flags__ in python type used for

object.h

很明显,__flags__是类的tpflags属性的整数表示。显示为二进制,您的示例是:

In [165]: "{0:29b}".format(str.__flags__)     # high bit (1UL << 28)
Out[165]: '10000000011000001010000000000'
In [166]: "{0:29b}".format(tuple.__flags__)   # (1UL << 26)
Out[166]: '  100000011000101010000000000'
In [167]: "{0:29b}".format(list.__flags__)   # (1UL << 25)
Out[167]: '   10000011000101010000000000'

object没有这些高专业位:

In [168]: "{0:29b}".format(object.__flags__)
Out[168]: '         11000001010000000000'
In [169]: "{0:29b}".format(np.ndarray.__flags__)
Out[169]: '         11000001010000000000'
In [171]: "{0:29b}".format(1<<10 | 1<<12 | 1<<18 | 1<<19)
Out[171]: '         11000001010000000000'

np.ufunc没有1<<10Py_TPFLAGS_BASETYPE

In [170]: "{0:29b}".format(np.ufunc.__flags__)
Out[170]: '         11000001000000000000'

我无法继承它:

In [173]: class foo(np.ufunc):
     ...:     pass
TypeError: type 'numpy.ufunc' is not an acceptable base type

用户定义类的标志是

In [176]: class Foo:
     ...:     pass
In [177]: "{0:29b}".format(Foo.__flags__)
Out[177]: '         11000101011000000001'

np.ndarray的子类也是如此,例如np.matrix

我们可以搜索tpflags定义

的numpy代码

https://github.com/numpy/numpy/search?utf8=%E2%9C%93&q=tpflags&type=

arrayobject.c中,标记设置为Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE。在ufunc_object.c Py_TPFLAGS_DEFAULT

总之,__flags__表明np.ndarray是普通的基类。 numpy不会尝试使用此属性设置任何特殊属性。