python – numpy数组子类在每个实例之间共享属性
发布时间:2020-12-16 23:35:42 所属栏目:Python 来源:网络整理
导读:我有一个奇怪的子类numpy.ndarray问题,感觉像 Values of instance variables of superclass persist across instances of subclass 但是,为了我的例子,我还没有完全理解或使其工作. 阅读 Slightly more realistic example – attribute added to existing ar
我有一个奇怪的子类numpy.ndarray问题,感觉像
Values of instance variables of superclass persist across instances of subclass 但是,为了我的例子,我还没有完全理解或使其工作. 阅读 这是我有的: 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',{}) 所以然后用它来展示这个问题 a = dmarray([1,2,3,4]) b = dmarray([1,4]) a.attrs['foo'] = 'bar' print(b.attrs) #{'foo': 'bar'} b.attrs is a.attrs # True # hmm.... 所以b正在拾起我不想要的attrs.令人烦恼的是,如果你这样做: from datamodel import * a = dmarray([1,4],attrs={'foo':'bar'}) b = dmarray([1,4]) b.attrs # {} 那么在世界上,我如何使这个dmarray工作怎么样呢? 编辑: class dmarray(numpy.ndarray): def __new__(cls,attrs=None): obj = numpy.asarray(input_array).view(cls) return obj def __init__(self,attrs=None): if attrs == None: attrs = {} self.attrs = attrs 所以通过从__new __()中删除kwarg并将其放在__init __()中.我刚刚尝试过这个“好吧,它可能会工作” a = dmarray([1,4]) a.attrs['foo'] = 'bar' b.attrs # {} 解决方法
问题在这里:
def __new__(cls,attrs={}) 不要在函数头中这样做attrs = {}.预期的结果是(可能)不是你认为的.这是一个常见的Python陷阱.见这里Default Parameter Values in Python 正确的方法如何做到这一点: def __new__(cls,attrs=None): if attrs is None: attrs = {} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |