Как создать матрицу объектов пользовательского класса в Python? - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над симулятором эпидемии c. Однако я столкнулся с проблемой: мне нужно создать матрицу моего пользовательского класса Location(), который имеет метод init (), равный __init(self, x_coords, y_coords, population, name)__. Все эти параметры должны быть случайными (исключая имя).

Единственная проблема, с которой я сталкиваюсь, - это попытка создать матрицу / карту этих пользовательских местоположений, которые я бы использовал в своей симуляции.
Я пробовал:

num_rows = 5
num_cols = 5

row = [Location() for i in range(num_rows)]
mat = [list(row) for i in range(num_cols)]

mat[0][0] = Location(...)
num_rows = 5
num_cols = 5

row = [Location() for i in range(num_rows)]
mat = [list(row) for i in range(num_cols)]

mat.append(Location(...))
w, h = 5, 5
Matrix = [[Location() for x in range(w)] for y in range(h)]

Matrix.append(Location(...))
w, h = 5, 5
Matrix = [[Location() for x in range(w)] for y in range(h)]

Matrix[0][0] = Location(...)

Все они сталкиваются с одной и той же ошибкой типа: «Ожидаемый тип« List [Location] »(соответствует generi c type« _T »), вместо него получено« Location »."

Я не работал с Python очень долго, поэтому я не знаю никаких обходных путей к этому, и я не нашел в Интернете ничего, чтобы помочь с этим.

Мой полный код выглядит сейчас так:

import random


# Location class
class Location:

    def __init__(self, x_coords, y_coords, population, name):
        self._x_coords = x_coords
        self._y_coords = y_coords
        self._population = population
        self._name = name

    # GETTERS VVVV
    def get_x_coords(self):
        return self._x_coords

    def get_y_coords(self):
        return self._y_coords

    def get_population(self):
        return self._population

    def get_name(self):
        return self._name


# Need to initialize a matrix of Location() here

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вам необходимо реализовать __init__(self, x_coords, y_coords, population, name) в вашем классе Location вместо __index__(self, x_coords, y_coords, population, name).

Вот код (упрощенные параметры конструктора Location):

num_rows = 5
num_cols = 5

class Location:
    def __index__(self, locationIndex=0):
        print( "Location::__index__(" + str( locationIndex) + ")")

    def __init__(self, locationIndex=0):
        print( "Location::__init__(" + str( locationIndex) + ")")

    row = [ Location(i) for i in range( 0, num_rows) ]
    mat = [ list(row) for i in range( 0, num_cols)]

    mat[0][0] = Location(...)
    print( mat)

и вывод:

Location::__init__(0)
Location::__init__(1)
Location::__init__(2)
Location::__init__(3)
Location::__init__(4)
Location::__init__(Ellipsis)

Обратите внимание, что не Location::__index__(), а Location::__init__() будет вызываться при понимании списка.

Последний вызов Location::__init__(Ellipsis) поступил из print( mat).

1 голос
/ 08 апреля 2020

Я верю, что вы хотите что-то вроде этого

num_col = 5
num_row = 5
mat = [[] for i in range(num_row)] # create a list of empty lists

for row in range(num_row):
    for col in range(num_col):
        mat[row].append(Location(...)) # populate each list with Locations
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...