2016-07-06 14 views
1

(親子[クラスへの新])パイソン - ネストされたクラスIは、このデータを持っている

{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

'22'は有効な識別子ではありません。 – CodenameLambda

+0

@CodingLambdasネストされた辞書に固執する方が良いでしょうか? –

+0

私は現在、回答を書いています。 – CodenameLambda

答えて

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 
+0

申し訳ありませんが、デモンストレーションの例を含めることができますが、私はそれを使用する方法を完全に理解していません。 –

+0

@SylentNyte Ok。 – CodenameLambda

+0

ありがとう、それは私が必要とするものですが、このコードを使用しようとするとエラーが発生します 'print(wednesday [23] .temperature)' "TypeError: '天気'オブジェクトはインデックス処理をサポートしていません" –

関連する問題