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
传递给构造函数,我会使用工厂函数来代替.但我假设您的真实代码中包含更多内容。
我正在尝试开发一个 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
传递给构造函数,我会使用工厂函数来代替.但我假设您的真实代码中包含更多内容。