如何继承带有参数的类而不在超类中添加参数

时间:2019-01-26 11:16:05

标签: python class inheritance

我希望我的Board类继承自我的Cell类。我的Cell类在其__init__函数中接受3个参数,但我不希望在__init__类的Board函数中接受3个参数。可以这样做吗?

class Board(Cell):
    def __init__(self):
        super().__init__(x, y, w)
        self.x = x
        self.y = y
        self.w = w 

而不是这样做:

class Board(Cell):
    def __init__(self, x, y, w):
        super().__init__(x, y, w)
        self.x = x
        self.y = y
        self.w = w

我的目标是在Board类中创建一个名为self.board的二维数组。
self.board = [[Cell(i * w, j * w, w) for i in range(3)] for j in range(3)]。因此,我不想从单元类继承参数,因为当我调用Board类时,我想创建没有任何参数的参数。

1 个答案:

答案 0 :(得分:2)

在您的情况下,这几乎肯定是没有意义的,但是没有什么可以阻止您提供不同的init并在其中重用超类init。您可以在调用父类之前设置固定变量。例如:

class Board(Cell):
    def __init__(self):
        x = 8
        y = 8
        w = 64
        super().__init__(x, y, w)
        self.x = x
        self.y = y
        self.w = w 

但是,您要在一个板上包含多个单元。这意味着,一个对象使用一个对象使用而不是继承的组合会更好。相反,您可以在板上包含一组单元对象并适当使用它们。这是一个可以激活单元格的示例,我们在板上提供了一种方法

class Board:
    def __init__(self):
        self.board = [[Cell(i * w, j * w, w) for i in range(3)] 
                       for j in range(3)]

    def activate_cell(x,y):
        self.board[x][y].activate()


b=Board()
#make the middle cell active
b.activate(1,1)

您的两个对象具有不同的接口这一事实通常可以很好地表明它们并不是一回事,因此继承不如组合法适当。

有关此的更多信息,请参见https://en.wikipedia.org/wiki/Composition_over_inheritance,其中进行了很好的讨论。还有一个堆栈溢出问题,第一个答案很好地说明了组合的好处以及何时选择继承-Prefer composition over inheritance?