Как добавить наследование классов в метод вне инициализации? - PullRequest
0 голосов
/ 06 июня 2018

Я хочу определить подкласс класса, и мне нужно, чтобы он был обновлен до одного из методов класса, а не инициализирован с самого начала.

Примером является хобби-проект с сетками и расстояниями в них.
Итак, я запускаю класс Grid следующим образом:

class Grid:
  def __init__(self):
    # A grid is a list of lists of cells. 
    self.grid = self.prepare_grid()
    self.configure_cells()
    self.maze = None

  def __getitem__(self, a_tuple):
    x, y = a_tuple
    return self.grid[x][y]

  def prepare_grid(self):
    ...

  def configure_cells(self):
    ...

Затем я хочу добавить функцию расстояния.Я думал, как в игре, в которой вы улучшили свой статус и превратились в сетку расстояний, с такими методами, как:

class DistanceGrid(Grid):
  def set_distances(self, root_cell):
    ...

  def path_to(self, goal):
    ...

.Поскольку я не хочу, чтобы он был инициализирован, а скорее улучшен до, мне нужен метод родительского класса, чтобы сделать его подклассом (выглядит почти рекурсивно, но, надеюсь, это не так).

from distances import DistanceGrid

class Grid: 
  ...

  def upgrade_distance(self, root):
    self = type(self, DistanceGrid)
    self.set_distances(root)

Можно ли это сделать?Я буду продолжать пытатьсяСпасибо

1 Ответ

0 голосов
/ 06 июня 2018

Вы говорите: «Поскольку я не хочу, чтобы он был инициализирован, а скорее улучшен, мне нужен метод родительского класса, чтобы сделать его подклассом».Вы когда-нибудь слышали о композиции как об альтернативе наследования?Это сделало бы так, чтобы у вас был метод в родительском классе, чтобы дал ему экземпляр DistanceGrid в качестве одного из атрибутов класса.Примерно так:

from distances import DistanceGrid

class Grid: 
  ...

  def upgrade_distance(self, root):
    self.distance_grid = DistanceGrid()
    self.distance_grid.set_distances(root)

Остальные методы в классе Grid могут либо действовать на self.distance_grid, если это метод, запускаемый после обновления, либо игнорировать его, если он не нужен.Может быть, это будет работать для вас?

Редактировать: Вы также можете сделать 3 класса;1-DistanceGrid, 2-Grid, 3-Choice, где класс Choice является единственным, который вы создаете, он наследует от обоих других классов, и вы сами решаете, какие методы вы хотите вызывать.

...