Objektorientierung - Tips?

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Hallo. Vorerst, ich hoffe es ist okay, dass ich meine Skripte hereinposte um eure Meinung zu sammeln und ggf. Vorschläge / Produktive Kritik zu erhalten. Nun gut ich habe mich die letzten Tage der Objektorientierung gewidmet und habe versucht so in etwa einen Haus Bau zu simulieren. Einige Probleme haben sich durch ausprobieren von selbst gelößt aber eines ist mir immer noch ein Dorn im Auge..
http://paste.pocoo.org/show/205619/
Es ist mir ein Rätsel wieso der Wert 3 in dem Dictionary den Wert Sehr Grosses Haus hat und 4 IndexError: list index out of range ergibt? Ich weiß das grundlegend bei 0 angefangen wird zu zählen aber das ist doch total durcheinander. Oder hat das was mit der Sortierung zu tun? Was ich noch wissen wollte ob diesmal noch der
BlackJack hat geschrieben:...Programmfluss über endlose Funktionsaufrufe die nie zurückkehren...
da ist.

xpilz
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha... da sieht ja einiges ziemlich schräg aus.

Als erstes: Wieso erstellst Du ein Dictionary, in welchem augenscheinlich die Keys mit den Werten vertauscht sind und welches Du dann nachträglich umänderst? Lege das Dict doch gleich richtig herum an!

"bauen" ist ein Verb - das zeigt Dir quasi schon, dass es nicht sinnvoll ist, eine Klasse so zu nennen. (Laut PEP8 schreibt man Klassennamen auch groß)

Generell wirkt das ganze zu gekünstelt. baue_haus() etwa baut ja nicht wirklich ein Haus, sondern prüft ja eher Bedingungen ab und printen Nachrichten.

Imho solltest Du Dir nicht theoretisch überlegen, wie man Klassen konstruiert, sondern ein sinnvolles Beispiel finden. Ggf. schau Dir mal in der Doku die Standard-Module an und gucke, wo es da Klassen gibt und welche Methoden sie bieten.

Als Klassiker könnte ich mir eine Bruch-Klasse vorstellen. Diese hat als Attribute Zähler und Nenner (wie auch immer die auf Englisch heißen ;-) ) und Du implementierst dann eben Standard-Operationen wie "add", "sub", usw. Zusätzlich ggf. noch Vergleichsoperationen, sowie eine __str__ und __repr__ Methode.

Ansonsten: Hast Du nicht irgend ein Programmier-Projekt, welches Du gerade verfolgst? Wenn ja, gibt es evtl. dort eine Möglichkeit, sinnvoll eine Klasse zu kreieren?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

In deinem Beispiel würde man wohl eher eine Klasse Haus erstellen und dieser evtl. eine Methode bauen() zuweisen, wenn dies nicht sowieso schon in __init__ gemacht wird...

Code: Alles auswählen

class Haus(object):
    
    ARTEN = [
        "Kleines Haus",
        "Normales Haus",
        "Grosses Haus",
        "Sehr Grosses Haus"
    ]
    
    def __init__(self, stockwerke=None, farbe=None):
        self.stockwerke = stockwerke
        self.farbe = farbe
        
    def bauen(self):
        if None in (self.stockwerke, self.farbe):
            print("Nicht alle Parameter gesetzt")
            return
        self.art = self.ARTEN[self.stockwerke]
        
    @property
    def info(self):
        return "Stockwerke %s" % self.stockwerke
    
if __name__ == '__main__':
    mein_haus = Haus()
    mein_haus.bauen()
    mein_haus.stockwerke = 2
    mein_haus.farbe = 'blau'
    mein_haus.bauen()
    print(mein_haus.art)
    
    
    mein_zweites_haus = Haus(3, 'lila')
    mein_zweites_haus.bauen()
    print(mein_zweites_haus.info)
Solche Beispiele sind natürlich immer ziemlich realitätsfern, aber vllt. siehst du, dass Objekte wirklich Objekte sein sollten und nicht als "Funktionen" missbraucht werden sollten. Mir war das jetzt zu mühsam die Funktionalität deines Programms nachzubauen, das kannst du ja machen.
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

@hyperion:
Oha... da sieht ja einiges ziemlich schräg aus.
Soll ich versuchen mich mehr an PEP8 zu halten, oder was schlägst du vor?

Ich habe ein Dictionary erstellt um die Werte als Zahlen einzugeben und nachher die Ausgabe als dessen Key herausbekommen. Aber wie ich sehe geht es mit einem Array auch. Fängt zwar nicht wie ich wollte mit 1 an, aber das ist nebensächlich.

Danke werde ich ändern. Ich denke ich übernehme den Namen von dem Beispiel von ahojness.

Ja, mir geht es hier in erster Hinsicht auch nicht um eine Verwirklichung oder um den Realitätswert der Klasse. Ich will ja nur austesten und daraus lernen, aber du hast Recht man sollte schon einen passenderen Namen verwenden.

Sinvolles Beispiel? Okay, ich werd mich da erkundigen..

Hmm. Gute Idee das probier ich mal aus.
und nein ich habe kein Projekt.. Hatte ich noch nie oO..

@ahojness:
Hmhm das Snippet sieht gut aus. Um zuzugeben auch besser als meins..
Und das:
..aber vllt. siehst du, dass Objekte wirklich Objekte sein sollten und nicht als "Funktionen" missbraucht werden sollten.
Merke ich mir, damit mir das nicht noch einmal passiert.

xpilz
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

xpilz hat geschrieben:Ja, mir geht es hier in erster Hinsicht auch nicht um eine Verwirklichung oder um den Realitätswert der Klasse. Ich will ja nur austesten und daraus lernen, aber du hast Recht man sollte schon einen passenderen Namen verwenden.
Wenn man kein Substantiv fuer den Klassennamen findet ist es ein starkes Indiz, dass man Klassen missbraucht und keine Objekte modelliert.

Edit: Deine if-Abfragen schreien auch geradezu nach Unterklassen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@ajohannes: Hm... um ehrlich zu sein gefält mir die Klasse auch nicht so wirklich - das liegt einfach am Beispiel selber. Das ganze sieht eher nach einer "Haus"-Factory-Klasse aus, als alles andere. Dein bauen() generiert ja quasi ein neues Haus, was ja eigentlich im Konstruktor erledigt werden sollte. Zudem würde ich eher eine Excption werfen, wenn etwas nicht vorliegt als eine Nachricht per print auszugeben. Hinzu kommt die Property: Wozu gibts denn __str__()? Imho bringt einem da das "info" keinen Mehrwert.

@xpilz: Konzepte lernt man aber nicht mit zu abstrakten Beispielen. Imho sollte das ganze funktional sein. Deine Klasse kannst Du doch nicht wirklich zu irgend etwas gebrauchen, oder?

Mit "schräg" meinte ich eher inhaltliche Dinge, wie etwa die falsche Design-Entscheidung für ein Dictionary.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

@hyperion: Wenn du meinen Post durchliest, siehst du dass ich genau das geschrieben habe:
bauen() zuweisen, wenn dies nicht sowieso schon in __init__ gemacht wird...
Wie gesagt, das Beispiel ist einfach nicht passend.
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

@cofi:
Wenn man kein Substantiv fuer den Klassennamen findet ist es ein starkes Indiz, dass man Klassen missbraucht und keine Objekte modelliert.
Okay..
Unterklassen? ich guck mal, wie ich das einbringen kann.

@Hyperion: Achso oO.. Nein da bin ich mir auch sicher.
Okay schräg, also mehr an die PEP8 halten?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

xpilz hat geschrieben:@cofi:
Wenn man kein Substantiv fuer den Klassennamen findet ist es ein starkes Indiz, dass man Klassen missbraucht und keine Objekte modelliert.
Okay..
Unterklassen? ich guck mal, wie ich das einbringen kann.
Nein, gar keine Klassen, sondern eine Funktion ;-) Was verstehst Du als "Unterklasse"?
@Hyperion: Achso oO.. Nein da bin ich mir auch sicher.
Okay schräg, also mehr an die PEP8 halten?
Das immer - aber ich meinte mit schräg inhaltliche Dinge, keine äußerlichen.
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Was verstehst Du als "Unterklasse"?
Vererbung :?: .. Auf jeden Fall weiß ich was jetzt damit gemeint ist.
Hyperion hat geschrieben:Das immer - aber ich meinte mit schräg inhaltliche Dinge, keine äußerlichen.
Hyperion hat geschrieben:Mit "schräg" meinte ich eher inhaltliche Dinge, wie etwa die falsche Design-Entscheidung für ein Dictionary.
Wie du bereits sagtest.. Sorry, ich müsste anfangen mir die Beiträge gründlicher durchzulesen. Sonst bringt das ja nichts..
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

xpilz hat geschrieben:
Was verstehst Du als "Unterklasse"?
Vererbung :?: .. Auf jeden Fall weiß ich was jetzt damit gemeint ist.
Ok. Aber wie kamst Du da jetzt drauf in dem Kontext?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:Ok. Aber wie kamst Du da jetzt drauf in dem Kontext?
Er hat scheinbar den falschen Teil des Zitats geloescht:
cofi hat geschrieben:Edit: Deine if-Abfragen schreien auch geradezu nach Unterklassen.
Benutzeravatar
xpilz
User
Beiträge: 76
Registriert: Sonntag 11. April 2010, 12:46
Wohnort: Deutschland
Kontaktdaten:

Hyperion hat geschrieben:Ok. Aber wie kamst Du da jetzt drauf in dem Kontext?
Ich kannte das Wort Unterklassen vorher noch nicht. Deswegen.
Antworten