2012-06-19 13 views
29

Wenn es um Design geht, in welchen Fällen macht es Sinn, Klasse gegen Diktat zu verwenden? Pros & Nachteile wäre auch nützlich.Wann Klasse gegen Diktat in Python verwenden?

Zum Beispiel

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

gegen

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

Related to [Python:? Soll ich eine Klasse oder ein Wörterbuch verwenden] (http://stackoverflow.com/questions/4045161/python-should-i-use-a-class-or-dictionary) und zu [Python dict in Objekt konvertieren?] (http://stackoverflow.com/questions/1305532/convert-python-dict-to-object) – ChaimG

Antwort

27

Ich würde sagen, die ersten und die wichtigsten Kriterien zu unterscheiden, ob eine Klasse verwenden oder ein Wörterbuch ist, ob Sie nur einige Daten haben wollen Speicher oder Sie möchten auch etwas Logik (dh Methoden) haben.

Wenn Sie nur mehrere Daten zusammenhalten müssen, dann ist vielleicht ein Wörterbuch der richtige Weg. Wenn Sie andererseits Operationen für diese Daten ausführen müssen und eine enge Beziehung zwischen den Daten und den Operationen besteht (die eine Art Entität bilden), dann erfordert dies wirklich die Verwendung einer Klasse.

Wie @Ben vorschlägt, können Sie nur ein Wörterbuch verwenden, wenn Sie eine Reihe verwandter Daten haben, und wenn Sie irgendwann feststellen, dass Sie auch eine Logik für diese Daten benötigen, können Sie das Wörterbuch in ein Klasse.

Sie können auch einen Blick auf die Unified Modeling Language (UML) und seine class diagrams werfen, um ein besseres Gefühl für die Verwendung von Klassen zu bekommen. Wenn Sie nur ein wenig scripten oder eine kleine Anwendung programmieren, müssen Sie UML möglicherweise nicht verwenden, aber wenn Sie ein größeres und komplexeres System entwerfen, kann es Ihnen wirklich helfen, vorher zu entscheiden, welche und wie viele Klassen Sie benötigen.

+1

ich würde nur hinzufügen, Sie können ziemlich leicht ein Diktat nehmen und es in eine Klasse später auf der Linie, wenn es sich herausstellt, dass Sie dachten, dass Sie nur die Datenassoziation wollten, aber später Logik benötigen. Ziehen Sie auch in Betracht, defaultdict zu verwenden, da es so aussieht, als würde es sich so verhalten, wie Sie sich verhalten wollen. – Ben

15

Ein dict kann einen beliebigen Hashwert als Schlüssel verwenden, während eine class Instanz Zeichenfolgen haben muss, die als "Schlüssel" eine rechtliche Kennung darstellen. So können Sie beliebige Daten in einem dict bündeln.

Es ist ziemlich üblich, eine triviale Klasse als eine mehr bequem dict zu verwenden, wenn Sie Ihre Schlüsselwerte alle gültigen Bezeichner Strings sowieso sein wird:

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

Sobald Sie die richtige objektorientiertes Design zu tun zu starten, und Sie haben Methodenfunktionen, die mit den Daten einhergehen, Sie möchten die Daten in einer geeigneten Klasse haben, damit Sie die Methodenfunktionen bündeln können. Es ist legal, nur ein Diktat und eine Handvoll globaler Funktionen zu haben, die darauf angewendet werden, aber wenn Sie sind alle verwandt, es macht nur Sinn, sie in eine class zu bündeln.

Und schließlich, ein dict ist ein Baustein, der verwendet wird, um eine class zu implementieren. Wenn Sie Werte in einer Klasse speichern, werden sie tatsächlich in einem internen dict gespeichert und es gibt nur eine bequeme Syntax, um auf sie zuzugreifen.

print(x.a) # prints 1 

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

Ausgezeichnete Antwort. Vor allem der Teil: "... und Sie haben Methodenfunktionen, die mit den Daten einhergehen, Sie möchten die Daten in einer geeigneten Klasse haben, damit Sie die Methodenfunktionen bündeln können.Es ist legal, nur ein Diktat und eine Handvoll globaler Funktionen zu verwenden, aber wenn sie alle miteinander verwandt sind, ist es nur sinnvoll, sie zu einer "Klasse" zusammenzufassen. "Das ist eines der wichtigsten Verkaufsargumente von OOP : Bündeln von Methoden und Daten, so dass wir keine globalen Funktionen haben müssen, die mit losen Variablen arbeiten. – Ugur

Verwandte Themen