如果我尝试跑步
import numpy as np
type(np.dtype).moo = 7
然后我明白了
TypeError: cannot set 'moo' attribute of immutable type 'numpy._DTypeMeta'
我找不到解释。
numpy._DTypeMeta
是一个 type
实例,所以这应该大致相当于
type.__setattr__(numpy._DTypeMeta, "moo", 7)
那么
type.__setattr__
中发生了什么检测到 numpy._DTypeMeta
应该是不可变的?
我可以想象像
float
这样的不可变内置函数可能存储在逻辑内存中的特定位置,并且 type.__setattr__
可以检查这一点,但 numpy 不是内置的。
这是一个有趣的问题,我很想看到对 C API 有更好了解的人的回答。
这是我的快速不完整(并且可能不正确)的看法:
numpy._DTypeMeta
在这里定义https://github.com/numpy/numpy/blob/a115ed3a3c92d8607c5eaa38a98825ac8a5e1bfc/numpy/core/src/multiarray/dtypemeta.c#L964Py_TPFLAGS_IMMUTABLETYPE
)不直接应用。PyType.Ready()
自动应用 Py_TPFLAGS_IMMUTABLETYPE
- https://docs.python.org/3/c-api/typeobj.html#c.Py_TPFLAGS_IMMUTABLETYPEnumpy._DTypeMetadata
类型“变得”不可变。