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 для конструктора, я бы просто использовал функцию фабрики вместо этого. Но я предполагаю, что в вашем реальном коде есть что-то еще.

Другие вопросы по тегам