我有一个奇怪的子类努比·恩达雷感觉像
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
# {}
问题在于:
千万不要在函数头中执行此操作
attrs={}
。预期的结果(可能)不是你想象的那样。这是一个常见的Python陷阱。请看这里Default Parameter Values in Python正确的方法是:
^{2}$相关问题 更多 >
编程相关推荐