ndarray.__new__如何知晓自身的调用来源?
关于numpy ndarray子类化中
__array_finalize__的obj参数来源问题 问题背景
在numpy的ndarray子类化文档中提到:
ndarray.__new__会将我们自定义类的新对象(self)以及视图来源对象(obj)传递给__array_finalize__。
疑问点:ndarray.__new__能创建新对象self并传给__array_finalize__,但从ndarray.__new__的签名来看,obj并非调用函数传入的参数,那它是如何获取obj的?是否依靠底层(C层面)机制判断调用场景(如构造函数调用、视图转换或模板新建)?
解答
obj参数确实不是Python调用方显式传入的,而是由numpy的底层C代码自动传递的。- numpy的C实现会追踪数组的创建上下文,根据不同的调用场景,自动确定要传递给
__array_finalize__的obj:- 直接调用自定义子类构造函数(如
MyArray([1,2,3])):此时没有来源数组,obj为None。 - 从现有数组创建视图(如
existing_arr.view(MyArray)):底层会把原数组作为obj传入。 - 通过切片、转置等操作生成子类实例,或通过
__array__接口转换时:底层会将原实例作为obj传递。
- 直接调用自定义子类构造函数(如
- Python层的
ndarray.__new__签名中看不到obj参数,是因为这个参数是C层在触发__array_finalize__时注入的,Python层的__new__实际是调用了C实现的核心逻辑,由C代码判断当前操作场景并提供obj。
内容的提问来源于stack exchange,提问作者Zhang Daniel
相关产品推荐
相关产品推荐

