为什么numpy ndarray对象没有__dict__属性?
Numpy数组为何没有__dict__属性?
先看实际操作中的问题:
>>> import numpy as np >>> a = np.arange(12) >>> a.reshape(3,4) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> type(a) <class 'numpy.ndarray'> >>> a.__dict__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'numpy.ndarray' object has no attribute __dict__. Did you mean: '__dir__'? >>> '__dict__' in dir(a) False
根据文档,obj.__dict__用于存储对象的可写属性。我们可以用dir(a)和getattr()获取数组的键值对属性,而且shape、itemsize等属性都能从数组构造参数推导出来,strides也可通过如下代码计算:
def calStrides(self, shape, itemSize): loops = len(shape) print(f"calculating strides... loop times = {loops}") lst = [] for i in range(loops): y = 1 # first multiplicand for j in range(i + 1, loops): y *= shape[j] lst.append(y * itemSize) self.cal_strides = tuple(lst)
疑问与解答:
这些属性是不是只读的?
是的。shape、strides、itemsize这类属性大多是只读的——你可以直接读取,但不能直接赋值修改(比如a.shape = (2,6)会报错,必须用reshape()生成新数组)。这些属性由数组的底层内存布局、数据类型等核心参数决定,numpy通过C扩展实现访问逻辑,而非存在于Python对象的__dict__中。
这是不是numpy ndarray不提供__dict__的原因?
是核心原因之一,再结合另外两点:
- 性能优先:numpy是面向高性能数值计算的库,
__dict__作为Python字典会带来额外内存开销和访问延迟,不符合C扩展类型的性能要求。 - 设计定位:numpy数组属于“值对象”,核心状态(数据、形状、类型等)由底层严格管理,不允许用户随意添加自定义属性,自然不需要
__dict__来存储动态属性。
替代的属性获取方式
没有__dict__也没关系:
- 用
dir(a)或a.__dir__()列出所有可用属性; - 用
getattr(a, 属性名)获取具体属性值,比如getattr(a, 'shape')。
内容的提问来源于stack exchange,提问作者Leon Chang
相关产品推荐
相关产品推荐

