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

Я работал над созданием алгоритма поиска bfs на двумерной сетке в Python (объектно-ориентированный). У меня есть класс Grid, который заботится о настройке 2D-сетки и имеет некоторые функции-члены для разметки стен, начальных / конечных точек и т. Д. c.

class Grid:

    def __init__(self, nodes=[]):
        self.nodes = nodes

    # Initializes a grid of rl x rc and fills all nodes with and empty value of 1
    def init_grid(self, rl, cl):
        arr = []
        arr2 = []
        for i in range(rl):
            for j in range(cl):
                arr2.append(Node("1", i, j))
            arr.append(arr2)
            arr2 = []
        self.nodes = arr

    # Sets the start and end points at the specified rows and cols
    def set_start_and_end(self, startr, startc, endr, endc):
        startNode = Node("S", startr, startc)
        endNode = Node("E", endr, endc)
        self.nodes[startr][startc] = startNode
        self.nodes[endr][endc] = endNode

    def mark_visited(self, row, col):
        self.nodes[row][col].val = "V"

    def mark_wall(self, row, col):
        self.nodes[row][col].val = "X"

У меня также есть файл, который будет содержать все мои алгоритмы поиска (пока только BFS). В одной из моих вспомогательных функций для поиска соседей узла он принимает как объект узла, так и объект сетки.

def get_neighbors(self, node, grid):
        neighbours = []

        R = len(grid)
        C = len(grid[0])

        dr = [-1, +1, 0, 0]
        dc = [0, 0, +1, -1]

        for i in range(4):
            rr = node.r + dr[i]
            cc = node.c + dc[i]

            if rr < 0 or cc < 0: continue
            if rr >= R or cc >= C: continue

            neighbour = grid[rr][cc]
            neighbours.append(neighbour)

        return neighbours

Я новичок в Python и пришел из языков типов, но есть ли способ как-то типизировать мои узлы и объекты сетки? На данный момент мне не нужно создавать экземпляры объектов сетки или узлов, но я не уверен, как получить к ним доступ в противном случае. Если только я не пойду об этом неправильно.

1 Ответ

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

Ваши функции класса сетки зависят от себя, поэтому вы должны создать экземпляр доступа, как сейчас. Если вам нужно поведение stati c, просто поместите атрибуты класса за пределы вашего конструктора:

class Grid():

    nodes = []
    def __init__(self):

    @staticmethod
    def init_grid(param1, param2):
        #Do stuff
        Grid.nodes = arr

Затем в другом файле from filename import Grid и вы сможете получить доступ к методу stati c с помощью Grid.init_grid() и получить доступ к узлам с помощью Grid.nodes Если вы не можете, вы можете получить объект "stati c" с помощью g_type = eval("Grid"), тогда вы можете получить доступ к своим членам "stati c" с помощью g_type.init_grid()

Надеюсь, это поможет.

...