Python - 将实例函数调用传递给属性

时间:2018-03-09 04:37:11

标签: python numpy

我试图编写一个定制的numpy数组包装器,它在99%的时间内表现得像一个numpy数组,但是对于我们的特定用例有一些额外的索引功能。我想知道这种行为是否可行。

理想情况下,除了我专门覆盖的任何内容之外,我能够将该类的实例视为所有行为的属性之一。我希望能够在我的包装类上调用所有numpy函数,除了一些特定的调用。

例如:

class LabeledArray(object):
    def __init__(self, array, label):
        self.array = array
        self.label = label

    def special_thing(self):
        print "I do a special thing here"

la = LabeledArray(np.zeros((5,2)), {'foo': 0, 'bar': 1})

la + 1
=> 
array([[1,1,1,1,1],
       [1,1,1,1,1]])

la.shape
=>
(5,2)

la.special_thing()
=>
"I do a special thing here"

基本上,我想通过一些自定义的侧面调整来保留numpy(广播等)的好处。

我确实知道我可以做la.array + 1,但我想知道是否有办法抽象掉那一层。

谢谢!

1 个答案:

答案 0 :(得分:1)

Numpy在subclassing上有文档。可用于实现此目的的构造示例如下:

class LabeledArray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return super(LabeledArray, cls).__new__(cls, *args, **kwargs)

    def special_thing(self):
        print('I do a special thing here')

LA = LabeledArray(shape=(2, 2), dtype=float, order='F')
LA.special_thing()
# I do a special thing here