Python 如何对numpy.ndarray的子类进行子类化

Python 如何对numpy.ndarray的子类进行子类化,python,numpy,subclassing,Python,Numpy,Subclassing,我正在努力为自己的numpy.ndarray子类划分子类。我真的不明白问题是什么,希望有人能解释一下在以下情况下出现了什么问题,以及如何做我想做的事情 我正在努力实现的目标: 我有一个子类numpy.ndarry,其行为符合我的要求(下面代码中的类a)。我想对A(下面代码中的类B)进行子类化,以便B包含附加信息(名称)和方法(修饰的.simple_数据方法) 案例1: 运行此代码将生成以下输出: Traceback (most recent call last): File "ndsubcl

我正在努力为自己的numpy.ndarray子类划分子类。我真的不明白问题是什么,希望有人能解释一下在以下情况下出现了什么问题,以及如何做我想做的事情

我正在努力实现的目标: 我有一个子类numpy.ndarry,其行为符合我的要求(下面代码中的类a)。我想对A(下面代码中的类B)进行子类化,以便B包含附加信息(名称)和方法(修饰的.simple_数据方法)

案例1: 运行此代码将生成以下输出:

Traceback (most recent call last):
  File "ndsubclass.py", line 24, in <module>
    b = B(data,'B')
TypeError: __new__() takes exactly 2 arguments (3 given)
应该这样做,但是如何更改obj的类

案例2: 运行时,输出为:

<class '__main__.A'>
Traceback (most recent call last):
  File "ndsubclass.py", line 30, in <module>
    print b.simple_data()
AttributeError: 'A' object has no attribute 'simple_data'

回溯(最近一次呼叫最后一次):
文件“ndsubclass.py”,第30行,在
打印b.简单_数据()
AttributeError:“一个”对象没有“简单数据”属性
正如我所期待的那样,这让我感到惊讶:

<class '__main__.B'>
[array([0, 1, 2, 3, 4]), array([ 0,  5, 10, 15])]

[数组([0,1,2,3,4]),数组([0,5,10,15])]
我假设B.new()中对view()的调用在某种程度上没有正确设置obj的类。为什么?


我对发生的事情感到困惑,如果有人能解释一下,我将不胜感激。

对于案例1,最简单的方法是:

class B(A):
    def __new__(cls,data,name):
        obj = A.__new__(cls, data)
        obj.name = name
        return obj
class B(A):
    def __new__(cls,data):
        obj = A(data)
        return obj.view(cls)
\uuuu new\uuuu
实际上是一个静态方法,它将类作为第一个参数,而不是类方法,因此您可以直接使用要创建其实例的类调用它

对于案例2,
视图
不起作用,您需要将结果分配给某个对象,最简单的方法是:

class B(A):
    def __new__(cls,data,name):
        obj = A.__new__(cls, data)
        obj.name = name
        return obj
class B(A):
    def __new__(cls,data):
        obj = A(data)
        return obj.view(cls)

另外,您已经在
A
B
中定义了相同的
\uuuu数组\u finalize\uuuuu
(可能只是一个打字错误)——您不需要这样做。

啊。。。因此,我可以通过将数组数据传递给一个..uuuuuu new_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是蟒蛇式的方法吗?@Ben我会用
super(B,cls)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您还可以更改
A
,以便它可以处理数量可变的参数或类似的内容,但这可能超出了这个问题的范围。太好了!那么我对上述两种情况的猜测正确吗?好的。。。知道了。非常感谢你的帮助!如果我能投票支持你的答案,我会的。
class B(A):
    def __new__(cls,data):
        obj = A(data)
        return obj.view(cls)