我有以下结构,并尝试根据传递给SeasonStats
的方法分派一个方法。我已经成功地创建了一个调度程序来启动特定的子类,但是现在我不知道如何使它能够调用所选的方法。我在底部添加了预期输出
class Base:
def __init__(self, league, season):
self.league = league
self.season = season
class PlayerStats(Base):
def __init__(self, *args, **kwargs):
Base.__init__(self, *args, **kwargs)
self.player_id = [1, 2, 3]
def get_player_stats(self):
for i in player_id:
print(i, self.league, self.season)
class TeamStats(Base):
def __init__(self, *args, **kwargs):
Base.__init__(self, *args, **kwargs)
self.team_id = [4, 5, 6]
def get_team_stats(self):
for i in player_id:
print(i, self.league, self.season)
class FixtureStats(Base):
def __init__(self, *args, **kwargs):
Base.__init__(self, *args, **kwargs)
self.fixture_id = [7, 8, 9]
def get_fixture_stats(self):
for i in player_id:
print(i, self.league, self.season)
class SeasonStats(PlayerStats, TeamStats, FixtureStats):
def __init__(self, *args, **kwargs):
print('SeasonStats successfully initiate')
def __call__(self, called_method, *args, **kwargs):
if hasattr(PlayerStats, called_method):
print('True P')
PlayerStats.__init__(self, *args, **kwargs)
elif hasattr(TeamStats, called_method):
print('True T')
TeamStats.__init__(self, *args, **kwargs)
elif hasattr(FixtureStats, called_method):
print('True F')
FixtureStats.__init__(self, *args, **kwargs)
else:
raise(ValueError)
if __name__ == '__main__':
stats = SeasonStats()
stats('get_team_stats', 'EN_PR', '2019')
>>>
SeasonStats successfully initiate
True T
4 EN_PR 2019
5 EN_PR 2019
6 EN_PR 2019
使用每个子类的分派映射解决了这个问题。即使它不是最优的,因为必须为每个子类创建一个调度映射,并且依赖于实现而不是抽象,但目前它是一个有效的解决方案
相关问题 更多 >
编程相关推荐