34

設計を検討するとき、class と dict のどちらを使用するのが理にかなっていますか? 長所と短所も役立ちます。

例えば、

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())

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

2 に答える 2

29

クラスとディクショナリのどちらを使用するかを区別するための最初の最も重要な基準は、データ ストレージが必要なのか、ロジック (メソッドなど) も必要なのかということです。

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

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

また、統一モデリング言語 (UML)とそのクラス図を見て、クラスの使用方法をよりよく理解することもできます。小さなアプリケーションのスクリプト作成やプログラミングを行っているだけであれば、UML を使用する必要はないかもしれませんが、より大規模で複雑なシステムを設計している場合は、必要なクラスとその数を事前に決定するのに非常に役立ちます。

于 2012-06-19T19:41:02.933 に答える
18

Adictはハッシュ可能な値をキーとして使用できますが、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ます。

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

print(x.a)  # prints 1

print(x.__dict__["a"])  # does exact same thing as previous line
于 2012-06-19T21:29:05.217 に答える