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