2 Stimmen

Wenn ich überall mit Wörterbüchern zu tun habe, sollte ich sie zu "Klassen" machen?

Im Moment habe ich viele Python-Dateien. Jede hat viele Funktionen.

Ich reiche überall Hash-Karten herum. Einfache Wörterbücher, mit einem Wort als Schlüssel und einer Punktzahl als Wert.

{ 'dog': 33, 'cat': 294 }

Ich mache auch einige kompliziertere Strukturen, zum Beispiel:

{ 'dog': [ 33, 66, 11, 88 ], 'cat': [11, 66, 22] }

Muss ich diese in meine eigenen "Objekte" umwandeln? Wenn ja, wie würden diese aussehen? Ich tue nicht OOP sehr viel, so dass ich diese noob Fragen stellen.

4voto

Peter Lyons Punkte 137811

Nachdem ich viele Jahre lang eine große Codebasis verwaltet habe, die rohe Dicts gegenüber Objekten bevorzugte, bin ich der Meinung, dass Sie, wenn diese Codebasis entweder A) von einer anderen Person oder B) von mehreren Personen verwaltet werden soll, auf echte Klassen und OOP umsteigen sollten. Vor allem die Tatsache, dass man leicht erkennen kann, welche Attribute eine Klasseninstanz haben soll, indem man sich den Quelltext ansieht oder sogar interaktiv mit dir() und anderen Introspektionstechniken ist Ihr Code viel einfacher zu erlernen, zu ändern und zu pflegen. Das Verständnis und die Fehlersuche sind bei Klassen mit intuitiven Namen, wohldefinierten Eigenschaften, Dokumentation und lesbarem Quellcode viel einfacher als bei einem riesigen Wirrwarr von Funktionen, die Dicts als Argumente nehmen und sie zur Laufzeit auf unzählige Arten umwandeln, die nur durch Lesen der gesamten Codebasis verstanden werden können. Tracebacks sind im Allgemeinen auch leichter zu lesen und zu entziffern, wenn Classe involviert sind, da man keine generischen Low-Level-Fehlermeldungen erhält.

Als weiteren Beweis können Sie sich ausgereifte und erfolgreiche Python-Projekte ansehen. Sie werden eine Menge OOP, Klassen und Dokumentation sehen. Rohe Dicts, Listen, Sets und Tupel sind großartig, wenn sie geeignet sind (Ihre Daten sind wirklich einfach) und für kleine Projekte und Skripte, aber die Wartbarkeit ist ab einer bestimmten Projektgröße nicht mehr gegeben. Der Gedanke "X ist nur ein Diktat" überlebt nur, solange Ihr Konzept von X extrem einfach ist.

3voto

Voo Punkte 27974

Je nachdem, was genau Sie tun, kann ein namedTuple könnte die beste Lösung für Ihr Problem sein. Es gibt nicht genug Informationen, um das mit Sicherheit sagen zu können.

3voto

Nick Craig-Wood Punkte 50398

Meine Faustregel lautet: Wenn Sie Funktionen haben, die auf das Wörterbuch wirken, dann sollte es wahrscheinlich eine Klasse sein, und diese Funktionen sollten Methoden sein.

Als (meist ehemaliger) Perl-Programmierer ist mir der oben beschriebene Stil sehr vertraut. Allerdings sind die Python OO-Tools viel leichter und es lohnt sich, sie eher früher als später einzusetzen.

Zum Beispiel

{ 'dog': 33, 'cat': 294 }

Wird zu etwas wie

class AnimalCount(object):
    """Some useful documentation you didn't have a place for before"""
    def __init__(self, dog=0, cat=0):
        self.dog = dog
        self.cat = cat
    def add_cat(self):
        self.cat += 1
    def add_dog(self):
        self.dog += 1
    def dog_eats_cat(self):
        self.cat -= 1

1voto

Jochen Ritzel Punkte 99416

OOP (oder jede andere Designphilosophie) ist eine Strategie zur Vereinfachung Ihres Codes, keine Religion, der Sie folgen, weil sie viele Treffer bei Google hat.

Das Ziel von OOP ist es, sich wiederholende Muster in Ihrem Code zu eliminieren: Wenn Sie häufig denselben Code schreiben, um diese Dicts zu verarbeiten, sollten Sie diese Muster herausrechnen und Funktionen schreiben. Manchmal werden Sie viele dieser Funktionen haben, die auf dieselbe Datenstruktur wirken, dann gruppieren Sie sie in einer Klasse zusammen.

Sollten Sie also eine Klasse verwenden? Nur wenn Sie glauben, dass es Ihren Code vereinfachen kann.

0voto

jcomeau_ictx Punkte 36287

Dicts sind für viele Zwecke geeignet. Wenn Sie einige Attribute hinzufügen möchten, können Sie einfach eine Dict-Unterklasse erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X