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?
有一些快速而直接的方法,还有一种重新思考继承的设计和使用的方法。
快速方法:perform_move在基类中进行接受*args和**kwargs参数;那么继承类也只是接受*args并且**kwargs这一切都会起作用。我不太喜欢它,因为这样我们就失去了函数签名,但它会让 pylint 停止抱怨。
更长远的方法:如果GameState不应该关心玩家的分数,那么我认为它还有其他一些单一的责任。will的子类GameState仍然具有相同的责任;他们只是以不同的方式实现它。但现在您还让它负责计算和跟踪玩家的分数。至少我认为这就是重写版本perform_move应该做的事情。
因此,也许您想要一个单独的类ScoreKeeper来跟踪分数,并且它不应该继承自GameState.
然后你会有一个类负责“处理”玩家的动作。这个类将分别与 进行通信,GameState以告诉它有关线位置的信息,并与 进行通信ScoreKeeper以告诉它有关玩家的信息。
| 归档时间: |
|
| 查看次数: |
2382 次 |
| 最近记录: |