Python 对象作为字典列表的列表

Python object as a list of lists of dictionaries

我正在尝试开发一个 class 作为列表的列表。我需要它在 deap 框架中将其作为个人类型传递。目前,我正在使用 numpy 对象数组。这是代码。

import numpy

class MyArray(numpy.ndarray):
    def __init__(self, dim):
        numpy.ndarray.__init__(dim, dtype=object)

但是当我尝试将值传递给 MyArray 的对象时,

a = MyArray((2, 2))
a[0][0] = {'procID': 5}

我收到一个错误,

Traceback (most recent call last):
File "D:/PythonProjects/NSGA/src/test.py", line 23, in <module>
    'procID': 5
TypeError: float() argument must be a string or a number, not 'dict'

欢迎提出任何建议。您也可以在不使用 numpy 的情况下向我展示一种不同的方式,这有助于创建类型。

可以找到类似的问题here

根据 the documentation,看起来 ndarray 使用 __new__() 进行初始化,而不是 __init__()。特别是,数组的 dtype 已经在您的 __init__() 方法 运行 之前设置,这是有道理的,因为 ndarray 需要知道它的 dtype 是什么知道要分配多少内存。 (内存分配与 __new__() 关联,而不是 __init__()。)因此您需要覆盖 __new__() 以向 ndarray 提供 dtype 参数。

class MyArray(numpy.ndarray):
    def __new__(cls, dim):
        return numpy.ndarray.__new__(cls, dim, dtype=object)

当然,您可以在您的class中有一个__init__()方法。它会在 __new__() 完成后 运行 ,这将是设置附加属性或您可能想做的任何其他事情的适当位置,而不必修改 [=11= 的行为]构造函数。

顺便说一句,如果你使用 classing ndarray 的唯一原因是你可以将 dtype=object 传递给构造函数,我会使用工厂函数来代替.但我假设您的真实代码中包含更多内容。