Python - 嵌套类(父子[类到新])

时间:2016-07-06 22:59:44

标签: python python-3.x

我有这个数据

{Wednesday : {22 : {Type = x,
                    Temp = x,
                    Speed = x,
                    Direction = x}
             {23 : {Type = x,
                    Temp = x,
                    Speed = x,
                    Direction = x}

我正在尝试编写一个类,以便我可以通过调用作为示例访问它,这将给我X.

到目前为止,我的代码是:

class Weather(object):
        def __init__(self, wtype, wtemp, wspeed, wdirection):
            self.type = wtype
            self.temp = wtemp
            self.speed = wspeed
            self.direction = wdirection

这允许我在调用日期时获取数据:

Wednesday.Temp
>>> 22 

但是我还需要按时间和日期分配数据,所以在致电"Wednesday.22.Type"时,我会得到具体的日期。

我是Python中的新手,我不太清楚如何构建类,以便我可以调用日期,然后调用获取相应数据的时间。我假设需要一个嵌套的类来拥有一个父母和孩子。就像代码中的关系一样,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

虽然数字不被认为是Python中的有效标识符(但对于拖钓来说可能很有趣:0 = 1 = 2 = 3 = 42),_3之类的东西是,但通常被认为是“私有python社区的“属性(包括我自己),所以我使用at后跟数字。而且我认为最好像访问字典一样访问它。

这是我的看法。如果您不想要相关的功能,请删除方法。

class SpecificWeather(object):
    def __init__(self, data):
        self.data = data

    @property
    def type(self):
        return self.data["Type"]

    @property
    def temperature(self):
        return self.data["Temp"]

    @property
    def speed(self):
        return self.data["Speed"]

    @property
    def direction(self):
        return self.data["Direction"]


class Weather(object):
    def __init__(self, data):  # data is the dictionary
        self.data = data

    def __getitem___(self, item):  # for wednesday[22].type
        return SpecificWeather(self.data[item])

    def __getattr__(self, name):  # for wednesday.at22.type
        if name.startswith("at"):
            return SpecificWeather(self.data[int(name[2:])])
        raise AttributeError()

    @property
    def type(self):
        # TODO: Return the average type or something like that

    @property
    def temperature(self):
        # TODO: Return the average temperature or something like that

    @property
    def speed(self):
        # TODO: Return the average speed or something like that

    @property
    def direction(self):
        # TODO: Return the average direction or something like that

此解决方案大量使用property,这有一个很大的优势:如果您将温度更改为22,wednesday[22].temperature现在将为您提供新值。但是如果你关心性能,而你只使用其中的一半,那么这个可能比存储结果更快,如果你多次访问它们,这将会慢得多。

如何使用它:

wednesday = Weather({
    22: {
        'Type': ...,
        'Temp': 30,
        'Speed': ...,
        'Direction': ...
    },
    23: {
        'Type': ...,
        'Temp': 28,
        'Speed': ...,
        'Direction': ...
    }
})

print(wednesday.at22.temperature)  # gives 30
print(wednesday[23].temperature)  # gives 28