我想定义一个类的子类,我需要将它升级到一个类的方法中,而不是从一开始就初始化。
这个例子是一个带有网格的爱好项目及其中的距离 所以我开始像这样的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)
可以这样做吗?我会继续努力。 感谢
答案 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类是您创建的唯一类,它继承自其他两个类,您可以决定在调用时调用哪些方法。