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__
获得相同的结果?
答案 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<<10
位Py_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
定义
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
不会尝试使用此属性设置任何特殊属性。