Simples OOP

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Simples OOP

Beitragvon Imperator » Dienstag 16. Oktober 2007, 15:00

Hi,

das was jetzt kommt ist nichts besonderes, und richtet sich ausdrücklich an Leute wie mich, denen nicht so wirklich klar ist wozu OOP eigentlich gut ist (also jetzt hab ichs kapiert). Überlegt einfach mal wie umständlich es wäre diesen Code um mehrere Anweisungen für die Menschen zu erweitern, wenn man nicht OOP benutzt.

Code: Alles auswählen

import random
from string import ascii_lowercase
class Mensch:
    def __init__(self):
        global Namen
        Namen = ['Alexander', 'Markus', 'Bert', 'Katharina', 'Sabrina', 'Vera', 'Colin', 'Daniel', 'Benedikt', 'Christian', 'Christoph', 'Gregor', 'Martin', 'Nicole', 'Jasmin', 'Sandra', 'Anke', 'Jack', 'Julia']
        self.Name = random.choice(Namen)
        self.Alter = random.randint(1,90)
    def Identifikation(self):
        Schwarm = random.choice(Namen)
        if Schwarm == self.Name:
            Schwarm = random.choice(Namen)
        print (self.Name)
        print (self.Alter)
        print ('Ich bin verliebt in ' + Schwarm)
       


Element = 1
ABC = ascii_lowercase
Zahl = random.randint(10,24)
for i in range(Zahl):
    print (ABC[Element])
    new_Instance = ABC[Element]
    New_Instance = Mensch()
    New_Instance.Identifikation()
    Element = Element + 1


Also, wie gesagt: Keine Glanzleistung, aber vielleicht für jemanden nützlich (also bitte nicht als Spam löschen).
BlackJack

Beitragvon BlackJack » Dienstag 16. Oktober 2007, 15:05

Wirklich keine Glanzleistung. Was zum Henker soll dieser `ABC`-Blödsinn? Und `Element`!? Und die Klammern bei den ``print``-Anweisungen?

Und warum fällt Dir nicht auf, dass dieser Quelltext gar nicht läuft weil Zeile 26 in einem `NameError` endet!?

Edit: Okay, kein `NameError`, habe nicht daran gedacht das es ``global`` gibt. ``global`` ist böse, bitte entfernen und so schreiben dass es ohne geht.

Einen zwingenden Grund für OOP kann ich in dem Beispiel übrigens nicht erkennen. Das hätte man auch mit einem Dictionary und Funktionen schreiben können.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Beitragvon Imperator » Dienstag 16. Oktober 2007, 15:10

Dieser ABC-Blödsinn, so wie er hier steht, wurde mir in diesem Forum so empfohlen.
Element habe ich als Variablennamen gewählt, da man schließlich von einem Element der Liste soundso spricht. Und warum ist global böse?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Dienstag 16. Oktober 2007, 15:41

Den ABC-Kram verstehe ich nicht. Ist einfach eine sehr komplizierte Methode, um die Buchstaben von b an aufsteigend auszugeben. Vielleicht hast du damit noch was anderes vor, aber das

Code: Alles auswählen

new_Instance = ABC[Element]
in zeile 24 ist ueberfluessig, da es in der naechsten Zeile wieder ueberschrieben wird.

global ist genau aus dem Grund boese, der BlackJack verwirrt hat: Sie machen Programme unuebersichtlich. Wenn du mal ein paar mehr Klassen und Funktionen hast, die alle globals benutzen, ist es nur sehr schwer zu ueberblicken, welche Abhaengigkeiten zwischen welchen Funktionen und Klassen bestehen. Vergiss am besten, dass es global gibt, man braucht es wirklich aeusserst selten. Da due die Namen ja nur innerhalb der Mensch-Klasse benoetigst, sie ausserdem fuer jedes Objekt gleich sein sollen, waere hier eine Klassenvariable angebracht.

Schau dir ausserdem mal PEP 8 an, es ist ueblich, Variablennamen und Funktionsnamen klein zu schreiben.

Warum du in der for-Schleife immer noch die Variable Element hochzaehlst, obwohl du ja schon i als Schleifenzaehler hast, ist auch raetselhaft.

EDIT: In Pep 8 steht auch drin, dass Zeilenlaengen nicht laenger als 80 Zeichen sein sollten. Seitwaertsscrollen ist nervig...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 16. Oktober 2007, 16:19

Imperator hat geschrieben:Dieser ABC-Blödsinn, so wie er hier steht, wurde mir in diesem Forum so empfohlen.

Wer hat dir denn empfohlen, eine falsche Datenstruktur für ein Problem zu wählen?

Und ganz ehrlich, eine saubere OOP-Lösung würde eigentlich ganz anders aussehen.

Der ganze Code ab Zeile 19 ist genau so ein Fall von "was hat sich der Autor dabei gedacht". Wenn ich es mir so oberflächlich ansehe, habe ich nicht die geringste Ahnung, zu was das führen soll.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Dienstag 16. Oktober 2007, 16:35

Das Programm erzeugt uebrigens eine ueberdurschnittlich hohe Rate an Homosexuellen. :wink: Und es koennen Leute in jemanden verliebt sein, den es garn nicht gibt... :o

:lol:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Dienstag 16. Oktober 2007, 16:52

Imperator hat geschrieben:Dieser ABC-Blödsinn, so wie er hier steht, wurde mir in diesem Forum so empfohlen.

Eigentlich wurdest du doch nur darauf hingewiesen, das du "abcde..." durch string.ascii_lowercase ersetzen solltest.
Noch eine, in diesem Fall vlt. bessere Möglichkeit:

Code: Alles auswählen

for i in xrange(Zahl):
    print chr(i+96)

:D
BlackJack

Beitragvon BlackJack » Dienstag 16. Oktober 2007, 16:57

Ausserdem fördert es das Vorurteil(?), das Homosexuelle keine dauerhaften Beziehungen eingehen. Sehr beständig ist das Verliebtsein ja nicht. Vielleicht handelt es sich bei `Mensch` ja um die Art Wesen, die in diesen komischen Vorabend-Soaps rumwuseln… :-)

@Rebecca: Bei dem Quelltext muss man ganz genau hinsehen: Die Zuweisung in Zeile 24 wird danach nicht gleich wieder überschrieben.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Dienstag 16. Oktober 2007, 17:04

BlackJack hat geschrieben:@Rebecca: Bei dem Quelltext muss man ganz genau hinsehen: Die Zuweisung in Zeile 24 wird danach nicht gleich wieder überschrieben.

...aber dennoch nicht verwendet (und so im nächsten loop überschrieben, was ja aber auch nix macht).
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Beitragvon Jan-Peer » Dienstag 16. Oktober 2007, 17:27

... ist noch was zum Zerfetzen übrig? :roll:
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Beitragvon Imperator » Dienstag 16. Oktober 2007, 17:36

OK, das mit dem verliebt sein, muss noch optimiert werden.
Diese Sachen mit den Variablen, sind deshalb so, weil ich das Programm von vornherein darauf ausgelegt habe, es mal weiterzuentwickeln. aber auf den Style-Guide pfeif ich.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Beitragvon Imperator » Dienstag 16. Oktober 2007, 17:40

Nachtrag: Ich habe übrigens von anfang an geschrieben, dass das ein Beispiel dafür sein soll wozu OOP gut ist, und nicht, dass es ein Musterprogramm ist. :?
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Beitragvon Andy » Dienstag 16. Oktober 2007, 18:04

Jan-Peer hat geschrieben:... ist noch was zum Zerfetzen übrig? :roll:


Jo, man sollte Quellcode immer kommentieren :!: Dann ist es für jeden leichter. Selbst der Verfasser könnte sich später fragen, warum er eine bestimmte Sache so und nicht so gelöst hat.

Imperator hat geschrieben:Nachtrag: Ich habe übrigens von anfang an geschrieben, dass das ein Beispiel dafür sein soll wozu OOP gut ist, und nicht, dass es ein Musterprogramm ist.
Ja, mag alles sein. Trotzdem solltest Du froh sein, das alle die hier gepostet haben, Dir eigentlich nur helfen wollten. Das man dabei ganz automatisch, ob positiv oder negativ, Kritik einstecken muss/sollte, ist irgendwie ganz logisch. Jeder will irgendwie nur vermitteln, das ginge auch so, oder so. Andererseits soll Dein Muster andere User nicht verwirren. Denn so wie BlackJack es zum Anfang schrieb, es hätte für Dein "Muster" auch eine Nicht-OOP-Programierweise ausgereicht.

Gruß Andy
Zuletzt geändert von Andy am Dienstag 16. Oktober 2007, 18:12, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Dienstag 16. Oktober 2007, 18:08

@Imperator: Es ist aber kein gutes Beispiel dafür wozu OOP gut ist. Das was OOP an Mehrwert bringt sind Polymorphie und Vererbung. Beides ist im Beispiel nicht zu sehen.

Und was total überflüssige Variablen und Quelltext mit Erweiterbarkeit zu tun haben ist mir auch nicht so ganz klar. Die `ABC` Geschichte hinterlässt eher den Eindruck dass Du keine Ahnung hast was Du da tust und das eher "programming by accident" ist. Das wird durch die Behauptung man habe Dir das hier so gesagt, noch unterstrichen.

Es ist kein gutes OOP-Beispiel und ein schlechtes Programmbeispiel. Wenn Leute die schon programmieren können verwirrt werden, was soll das dann bei Einsteigern bringen!?

Mit der Trotzhaltung gegenüber dem Style Guide punktest Du auch nicht nicht gerade. Klar gibt es da abweichende Meinungen ─ über mixedCase, CapWords oder kleine_worte_mit_unterstrichen bei Attributen und Funktionsnamen kann man streiten, aber ALL_CAPS für etwas was keine Konstante ist oder etwas anderes als CapWords für Klassen sind IMHO nicht "verhandelbar". Das verwirrt einfach zu viele Leser weil das sprachübergreifend Assoziationen bei Programmierern weckt, mit denen man besser nicht brechen sollte.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Dienstag 16. Oktober 2007, 19:41

hier mal ein swinger :D

Code: Alles auswählen

from random import choice
Namen = [   'Alexander', 'Markus', 'Bert',
            'Katharina', 'Sabrina', 'Vera',
            'Colin', 'Daniel', 'Benedikt',
            'Christian', 'Christoph', 'Gregor',
            'Martin', 'Nicole', 'Jasmin',
            'Sandra', 'Anke', 'Jack', 'Julia' ]
def verliebt_in(): 
    return ' ich bin verliebt in '.join([choice(Namen or Namen) for i in range(10)])
print verliebt_in(),


edit: Hallo Imperator wollte nur sagen, sorry wenn ich es hier einfach reingepostet habe. Zu OOP wurde aber schon alles gesagt.

Gruss
pyStyler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder