如何接受子类中的附加参数?(没有pylint的论点 - 不同)

Sim*_*n L 5 python pylint python-3.x

我有一个代表游戏状态的基类并提供了一个perform_move方法:

class GameState:
  # other code
  def perform_move(self, position: LinePosition) -> MoveResult:
    # more code
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个GameState跟踪玩家分数的子类。因为基类不关心玩家(关注点分离),所以我需要一个额外的参数来识别正在执行移动的玩家。我尝试了以下方法:

class ScoreKeepingGameState(GameState):
  # other code
  def perform_move(self, position: LinePosition, *, player_identification: Optional[int] = None) -> MoveResult:
    # more code
Run Code Online (Sandbox Code Playgroud)

我希望这能奏效,因为我可以调用ScoreKeepingGameState'sperform_move完全没问题player_identification,唉 pylint 抱怨:

W0221:参数不同于重写的“perform_move”方法(参数不同)

是否有比添加# pylint: disable=arguments-differ到 的perform_move定义更清洁的方法来满足 pylint ScoreKeepingGameState

Lag*_*aer 3

有一些快速而直接的方法,还有一种重新思考继承的设计和使用的方法。

快速方法:perform_move在基类中进行接受*args**kwargs参数;那么继承类也只是接受*args并且**kwargs这一切都会起作用。我不太喜欢它,因为这样我们就失去了函数签名,但它会让 pylint 停止抱怨。

更长远的方法:如果GameState不应该关心玩家的分数,那么我认为它还有其他一些单一的责任。will的子类GameState仍然具有相同的责任;他们只是以不同的方式实现它。但现在您还让它负责计算和跟踪玩家的分数。至少我认为这就是重写版本perform_move应该做的事情。

因此,也许您想要一个单独的类ScoreKeeper来跟踪分数,并且它不应该继承自GameState.

然后你会有一个类负责“处理”玩家的动作。这个类将分别与 进行通信,GameState以告诉它有关线位置的信息,并与 进行通信ScoreKeeper以告诉它有关玩家的信息。