如何使用多重继承和多态分派?

2024-09-27 09:24:59 发布

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

我有以下结构,并尝试根据传递给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

Tags: selfidbaseinitdefstatsargskwargs
1条回答
网友
1楼 · 发布于 2024-09-27 09:24:59

使用每个子类的分派映射解决了这个问题。即使它不是最优的,因为必须为每个子类创建一个调度映射,并且依赖于实现而不是抽象,但目前它是一个有效的解决方案

class Base:

    def __init__(self, league, season):
        self.league = league
        self.season = season


class PlayerStats(Base):

    def __init__(self, *args, **kwargs):
        self.dispatch_map = { 'get_player_stats' : self.get_player_stats}
        Base.__init__(self, *args, **kwargs)
        self.player_id = [1, 2, 3]

    def get_player_stats(self):
        for i in self.player_id:
            print(i, self.league, self.season)

class TeamStats(Base):
    def __init__(self, *args, **kwargs):
        self.dispatch_map = { 'get_team_stats' : self.get_team_stats}
        Base.__init__(self, *args, **kwargs)
        self.team_id = [4, 5, 6]

    def get_team_stats(self):
        for i in self.team_id:
            print(i, self.league, self.season)

class FixtureStats(Base):
    def __init__(self, *args, **kwargs):
        self.dispatch_map = { 'get_fixture_stats' : self.get_fixture_stats}
        Base.__init__(self, *args, **kwargs)
        self.fixture_id = [7, 8, 9]

    def get_fixture_stats(self):
        for i in self.fixture_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)
            self.dispatch_map.get(called_method)()

        elif hasattr(TeamStats, called_method):
            print('True T')
            TeamStats.__init__(self, *args, **kwargs)
            self.dispatch_map.get(called_method)()

        elif hasattr(FixtureStats, called_method):
            print('True F')
            FixtureStats.__init__(self, *args, **kwargs)
            self.dispatch_map.get(called_method)()
        else:
            raise(ValueError)

    def call_func(self, func):
        return func

if __name__ == '__main__':
    stats = SeasonStats()
    stats('get_player_stats', 'EN_PR', '2019')
    stats('get_team_stats', 'EN_PR', '2019')
    stats('get_fixture_stats', 'EN_PR', '2019')

相关问题 更多 >

    热门问题