numpy array子类在实例之间毫无疑问地共享属性

2024-09-30 01:34:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个奇怪的子类努比·恩达雷感觉像
Values of instance variables of superclass persist across instances of subclass
但我还不能完全理解,也不能让它为我的例子起作用。在

通读 Slightly more realistic example - attribute added to existing array我正努力做到这一点。我想向数组添加attrs属性,以保存字典中的单位等信息。在

以下是我所拥有的:

import numpy
class dmarray(numpy.ndarray):
    def __new__(cls, input_array, attrs={}):
        obj = numpy.asarray(input_array).view(cls)
        obj.attrs = attrs
        return obj

    def __array_finalize__(self, obj):
        # see InfoArray.__array_finalize__ for comments
        if obj is None:
            return
        self.attrs = getattr(obj, 'attrs', {})

然后用它来证明问题

^{pr2}$

所以b正在接收我不希望它出现的属性。令人恼火的是,如果你这样做,效果会很好:

from datamodel import *
a = dmarray([1,2,3,4], attrs={'foo':'bar'})
b = dmarray([1,2,3,4])
b.attrs
# {}

那么,我到底如何让这个dmarray按照我想要的方式工作呢?在


编辑: 好吧,这似乎能解决问题,但我不明白为什么。所以让我们把问题改成这是在做什么,为什么有效?在

class dmarray(numpy.ndarray):
    def __new__(cls, input_array, attrs=None):
        obj = numpy.asarray(input_array).view(cls)
        return obj

    def __init__(self, input_array, attrs=None):
        if attrs == None:
            attrs = {}
        self.attrs = attrs

因此,通过从__new__()中删除kwarg并将其放入__init__()中,就可以了。我只是想说“这可能有用”

a = dmarray([1,2,3,4])
b = dmarray([1,2,3,4])
a.attrs['foo'] = 'bar'
b.attrs
# {}

Tags: ofimportselfnumpynoneobjnewinput

热门问题