Python объект как список списков словарей
Я пытаюсь разработать класс, который ведет себя как список списков. Мне нужно, чтобы передать его как тип для человека, в глубокой структуре. В настоящее время я работаю с массивом 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, который облегчает создание типов.
Подобный вопрос можно найти здесь
1 ответ
По документации это выглядит так ndarray
использования __new__()
делать его инициализацию, а не __init__()
, В частности, dtype
массива уже установлен перед вашим __init__()
метод работает, что имеет смысл, потому что ndarray
нужно знать, что его dtype
это знать, сколько памяти выделить. (Распределение памяти связано с __new__()
не __init__()
.) Так что вам нужно переопределить __new__()
обеспечить dtype
параметр для ndarray
,
class MyArray(numpy.ndarray):
def __new__(cls, dim):
return numpy.ndarray.__new__(cls, dim, dtype=object)
Конечно, вы также можете иметь __init__()
метод в вашем классе. Это будет работать после __new__()
закончил, и это было бы подходящим местом для установки дополнительных атрибутов или чего-либо еще, что вы можете захотеть сделать, что не должно изменять поведение ndarray
конструктор.
Кстати, если единственная причина, по которой вы подкласс ndarray
это так, что вы можете пройти dtype=object
для конструктора, я бы просто использовал функцию фабрики вместо этого. Но я предполагаю, что в вашем реальном коде есть что-то еще.