2012-06-19 13 views
29

デザインを考慮する場合、どの場合にはクラス対dictを使用するのが理にかなっていますか? Pros &短所も有用でしょう。Pythonでclassとdictをいつ使うのですか?

albumstate['album'] = album 
albumstate['photos_shown'] = [] 
albumstate['photos_notshown'] = range(album.size()) 
+0

[Pythonの:?私はクラスや辞書を使用すべき](http://stackoverflow.com/questions/4045161/python-should-i-use-a-class-or-dictionary)と[Python dictをオブジェクトに変換する]にはどうすればいいですか?(http://stackoverflow.com/questions/1305532/convert-python-dict-to-object) – ChaimG

答えて

27

例えば、

class AlbumState: 
    """ AlbumState class, tracks photos shown, etc""" 

    def __init__ (self, album): 
     """ album for this object will track state""" 
     self.album = album 

     self.photos_shown = [] 
     self.photos_notshown = range(album.size()) 

私は、クラスを使用するかどうかを区別するために、最初の、そして最も重要な基準を言うでしょうか辞書には、あなただけのいくつかのデータを持っているかどうかでありますまた、いくつかのロジック(つまり、メソッド)が必要な場合もあります。

複数のデータをまとめて保存する必要がある場合は、辞書を使用してください。一方、そのデータに対して実行される操作が必要で、データと操作の間に非常に密接な関係がある場合(一種のエンティティを形成する場合)、実際にはクラスを使用する必要があります。

@Benが示唆しているように、関連するデータがたくさんあるときは辞書を使い始めることができます。また、ある時点でそのデータのロジックが必要であると分かっている場合は、クラス。

また、クラスの使い方については、Unified Modeling Language (UML)とそのclass diagramsをご覧ください。小さなアプリケーションのプログラミングやプログラミングをしているだけでは、UMLを使う必要はないかもしれませんが、より大きくて複雑なシステムを設計している場合は、事前に必要なクラスとクラスを決定するのに役立ちます。

+1

私は追加するだけです。あなたがデータの関連付けだけを望んだと思ったが、それに続いてロジックが必要だと分かった場合は、クラスを後でダウンする。また、defaultdictの使用を検討してください。これは、あなたのdictsの振る舞いを振る舞うように見えるからです。 – Ben

15

dictは、任意のハッシュ可能な値をキーとして使用できますが、classインスタンスは正当な識別子である文字列をその「キー」として持つ必要があります。したがって、任意のデータをまとめてdictにまとめることができます。

それはあなたのキー値がすべてとにかく有効な識別子の文字列になりますと、より-便利dictとして自明なクラスを使用するためにはかなり一般的です:

class Box: 
    pass 

x = Box() 

x.a = 0 
x.b = 1 

d = {} 
d["a"] = 0 # "x.a" is easier to type than this 
d["b"] = 1 

print("Current value for 'a' is: {}".format(x.a)) 

とすぐに適切なオブジェクト指向設計を行うことを始めると、とあなたはメソッドの関数を持っているので、データを適切なクラスに入れてメソッドの関数をバンドルすることができます。彼らはすべて関連している、それだけでclassにそれらをバンドルすることが理にかなっています。

最後に、dictclassの実装に使用されるビルディングブロックです。クラスに値を格納する場合、それらは実際には内部のdictの内部に格納されており、アクセスするための便利な構文がいくつかあります。

print(x.a) # prints 1 

print(x.__dict__["a"]) # does exact same thing as previous line 
に関連
+0

優れた答え。特に、「データに沿ったメソッド関数があります。データを適切なクラスに入れて、メソッド関数をバンドルすることができます。それだけではなく、それを操作するグローバル関数をいくつか持つことは合法ですが、もしそれらがすべて関連していれば、それらを 'クラス 'にまとめるのは理にかなっています。これはOOPの主要なセールスポイントの1つです:方法とデータを束ねるため、緩い変数で動作するグローバル関数を持つ必要はありません。 – Ugur

関連する問題