如何在初始化之外的方法中添加类继承?

时间:2018-06-06 10:27:22

标签: python class subclass

我想定义一个类的子类,我需要将它升级到一个类的方法中,而不是从一开始就初始化。

这个例子是一个带有网格的爱好项目及其中的距离 所以我开始像这样的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 :(得分:1)

你说,"由于我不希望它被初始化,而是改进了,我需要在父类上使用一个方法使它成为一个子类"。您是否曾听说过 composition 作为继承的替代方案?它会使你在父类上有一个方法给它一个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类是您创建的唯一类,它继承自其他两个类,您可以决定在调用时调用哪些方法。