Python:类中的Sub属性

时间:2016-09-03 19:08:22

标签: python class

这可能是一个愚蠢的问题,但我被困在这里。在Python中,我创建了一个类Match,其中包含一些属性,如my_match.goals,my_match.yellow_cards等。 我希望每场比赛都有一些相同的属性,但仅限于比赛的前半部分。 理想情况下,我的第一个想法是一种子属性,类似于

my_match.half_time.goals

但当然不起作用。

我的问题是:这种必要性的最佳数据结构是什么?我将如何实现它?我认为子类不是一个好主意,因为我希望同一个实例能够描述半个时间和全部时间。 谢谢!

2 个答案:

答案 0 :(得分:1)

为了避免使用或创建另一个类,您可以使用namedtuples个对象。可以使用诸如变量引用之类的对象或标准元组语法来引用命名的元组实例。

from collections import namedtuple
HalfTime = namedtuple('Halftime', 'goals yellow_cards')
my_match.half_time = HalfTime(4, 5)
my_match.half_time.goals
>>> 4
my_match.half_time.yellow_cards
>>> 5

如果您想更新价值

my_match.half_time = my_match.half_time._replace(goals=10)

答案 1 :(得分:1)

您所描述的是一组统计数据,并为匹配的不同时段维护单独的统计数据集。

我将使用单独的统计类来实现它,并且在Match的不同时段具有该类的多个实例,包括一个累积整个Match的统计信息的实例。也许是这样的:

class Statistics(object):
    def __init__(self):
        self.__goals = 0
        self.__yellow_cards =0
    def getGoals(self): return self.__goals
    def addGoal(self): self.__goals += 1
    …

class AccumulatedStatistics(object):
    def __init__(self, *statistics):
        self.__statistics = list(statistics)
    def getGoals(self):
        return reduce(lambda a,b:a.getGoals() + b.getGoals(), statistics)
    …

class Match(object):
    def __init__(self):
        self.quarterStats = [Statistics(), Statistics(), Statistics(), Statistics()]
        self.halfStats = [
            AccumulatedStatistics(self.quarterStats[0], self.quarterStats[1]), 
            AccumulatedStatistics(self.quarterStats[2], self.quarterStats[3]),
        ]
        self.matchStats = AccumulatedStatistics(*self.quarterStats)