Python 如何接受子类中的附加参数?(不带pylint的参数不同)
我有一个表示游戏状态的基类,它提供了Python 如何接受子类中的附加参数?(不带pylint的参数不同),python,python-3.x,pylint,Python,Python 3.x,Pylint,我有一个表示游戏状态的基类,它提供了perform\u move方法: class GameState: # other code def perform_move(self, position: LinePosition) -> MoveResult: # more code 现在我想创建一个子类GameState,它跟踪玩家的得分。 因为基类不关心玩家(关注点分离),所以我需要一个额外的参数来识别执行移动的玩家。 我尝试了以下方法: class ScoreKeepin
perform\u move
方法:
class GameState:
# other code
def perform_move(self, position: LinePosition) -> MoveResult:
# more code
现在我想创建一个子类GameState
,它跟踪玩家的得分。
因为基类不关心玩家(关注点分离),所以我需要一个额外的参数来识别执行移动的玩家。
我尝试了以下方法:
class ScoreKeepingGameState(GameState):
# other code
def perform_move(self, position: LinePosition, *, player_identification: Optional[int] = None) -> MoveResult:
# more code
我希望这能起作用,因为我可以调用ScoreKeepingGameState
的执行移动
而无需玩家识别
,唉,派林抱怨说:
W0221:参数与重写的“执行移动”方法不同(参数不同)
是否有一种更干净的方法来满足pylint的要求,而不是将
\pylint:disable=arguments different
添加到perform\u move
对ScoreKeepingGameState
的定义中?有一些快速直接的方法,然后是重新思考继承设计和使用的方法
快速方法:使在基类中执行_move
接受*args
和**kwargs
参数;然后,继承类也只接受*args
和**kwargs
,这一切都会起作用。我不太喜欢它,因为这样会丢失函数签名,但这会让pylint停止抱怨
更长远的方法是:如果游戏状态
不应该关心玩家的分数,那么我认为它还有其他单一的责任。GameState
的子类仍将承担同样的责任;他们只是用一种不同的方式来实现它。但现在你也让它负责计算和跟踪球员的得分。至少我认为这就是被覆盖的perform\u move
版本应该做的
因此,也许您需要一个单独的类ScoreKeeper
,只用于跟踪分数,它不应该继承自GameState
然后你会有一个类负责“处理”玩家的移动。这个类将分别与游戏状态
通信,告诉它关于线的位置,并与记分员
通信,告诉它关于玩家的信息