加入收藏 | 设为首页 | 会员中心 | 我要投稿 大庆站长网 (https://www.0459zz.com/)- 科技、智能边缘云、事件网格、云计算、站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – numpy数组子类在每个实例之间共享属性

发布时间:2020-10-19 17:38:42 所属栏目:Python 来源:互联网
导读:我有一个奇怪的子类numpy.ndarray问题,感觉像 Values of instance variables of superclass persist across instances of subclass 但是,为了我的例子,我还没有完全理解或使其工作. 阅读 Slightly more realistic example – attribute added to existing a

我有一个奇怪的子类numpy.ndarray问题,感觉像
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',{})

所以然后用它来展示这个问题

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 = {}

(编辑:大庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读