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

2024-09-19 23:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的Board类从我的Cell类继承。我的Cell类在它的__init__函数中接受3个参数,但我不希望在我的Board类的__init__函数中接受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

我的目标是制作一个名为自板董事会内部。
self.board = [[Cell(i * w, j * w, w) for i in range(3)] for j in range(3)]。因此,我不想从cell类继承参数,因为当我调用Board类时,我想创建一个没有任何参数的类。你知道吗


Tags: 函数inselfboard目标for参数init
1条回答
网友
1楼 · 发布于 2024-09-19 23:28:48

这在您的案例中几乎肯定没有意义,但是没有什么可以阻止您提供不同的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,它有一个很好的讨论。还有一个堆栈溢出问题,第一个答案很好地解释了组合的好处以及何时选择继承。你知道吗

相关问题 更多 >