You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:24:54