Zusammenspiel der Klassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Hallo ,
ich habe ein Problem und suche dringend Hilfe.
Also ich bin Python (3.1) Anfänger und wollte mir einmal das Zusammenspiel der Klassen angucken.
Das Scribt soll nichts anderes machen als mir die Versionsinfo einer exe wiederzugeben.
Mei Problem ist das Zusammenspiel zwische dem Aufruf der Funktion Ausfuehren() im Modul MDL_GetVersion() aus der Klasse MDL_Eingabe():
Dabei ist das Problem, das ich es nicht schaffe die richtige Anzahl der Argumente zu übergeben.
Ich habe schon allesmögliche via try&error ausprobiert aber kein Weg wollte klappen.

Ich hoffe das mir jemand helfen kann und ich nicht zu kryptisch war
import subprocess

class MDL_GetVersion():
def __init__(self,spfad):
self.spfad = spfad
self.proc = none

def Ausfuehren(self,spfad):

# Aufruf der "GetVersionInfo.exe" zur Ausgeba der Hilfe auf stdout
self.proc = subprocess.Popen(["C:/tmp/GetVersionInfo.exe", spfad], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

self.oMDL_Ausgabe = MDL_Ausgabe()
self.oMDL_Ausgabe.ausgabe(self.proc)






class MDL_Ausgabe():
def Versionsausgabe(self):


# entfernen von Whitespace - characters am Ende jeder Zeile von stdout
self.stdoutput = [line.rstrip() for line in proc.stdout]
print ("STDOUT:")
# Ausgeben aller Zeilen
for line in stdoutput:
print (line)


# entfernen von Whitespace - characters am Ende jeder Zeile von stderr
self.stderror = [line.rstrip() for line in proc.stderr]

print ("STDERR:")
# Ausgeben aller Zeilen
for line in self.stderror:
print (line)

class MDL_Eingabe():
def Pfadeingabe(self):
self.pi_sPfad = input("Bitte geben Sie den Pfad der exe ein deren Versionsnummer Sie wuenschen")
self.oMDL_GetVersion = MDL_GetVersion()
self.oMDL_GetVersion.Ausfuehren(self.pi_sPfad)


oMDL_Eingabe = MDL_Eingabe()

oMDL_Eingabe.Pfadeingabe()
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

So würde das Ganze übrigens mit Code-Tags (der Button in der Mitte, direkt unter der Überschrift, wo "Python" steht) aussehen:
Bluekobalt hat geschrieben:

Code: Alles auswählen

import subprocess

class MDL_GetVersion():
    def __init__(self,spfad):
        self.spfad = spfad
        self.proc = none

    def Ausfuehren(self,spfad):

        # Aufruf der "GetVersionInfo.exe" zur Ausgeba der Hilfe auf stdout
        self.proc = subprocess.Popen(["C:/tmp/GetVersionInfo.exe", spfad], stdout=subprocess.PIPE,  stderr=subprocess.PIPE)

        self.oMDL_Ausgabe = MDL_Ausgabe()
        self.oMDL_Ausgabe.ausgabe(self.proc)






class MDL_Ausgabe():
   def Versionsausgabe(self):


        # entfernen von Whitespace - characters am Ende jeder Zeile von stdout
        self.stdoutput = [line.rstrip() for line in proc.stdout]
        print ("STDOUT:")
        # Ausgeben aller Zeilen
        for line in stdoutput:
            print (line)


        # entfernen von Whitespace - characters am Ende jeder Zeile von stderr
        self.stderror = [line.rstrip() for line in proc.stderr]

        print ("STDERR:")
        # Ausgeben aller Zeilen
        for line in self.stderror:
            print (line)

class MDL_Eingabe():
    def Pfadeingabe(self):
        self.pi_sPfad = input("Bitte geben Sie den Pfad der exe ein deren Versionsnummer Sie wuenschen")
        self.oMDL_GetVersion = MDL_GetVersion()
        self.oMDL_GetVersion.Ausfuehren(self.pi_sPfad)


oMDL_Eingabe = MDL_Eingabe()

oMDL_Eingabe.Pfadeingabe()
Übrigens ist es hier IMHO unnötig, Klassen zu benutzen.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Ersteinmal viele Dank für das aufmotzen meines Codes.
Ich weiss das es nicht nötig ist Klassen zu benutzen.
Es ist aber möglich.
Ich möchte auf diesem Wege das Zusammenspiel der Klassen erlernen und dafür ist dieses Beispiel so gut wie jedes andere.
Ich bin in diesen Zusammenhang auch scho öfters auf das Problem der" nicht richtigen Anzahl Argumente " bei dem Methodenaufruf gestossen.
Ich mache also irgendetwas grundsätzlich falsch....
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nee, dein Beispiel ist denkbar schlecht um daran etwas sinnvolles mit OOP zu machen. Klassen sind kein Selbstzweck und sollten nur dort eingesetzt werden, wo sie auch einen Nutzen bringen. Du benutzt sie hier nur als Namensraum für Funktionen.

Als Alternative bietet sich zum Beispiel die allseits beliebte Adressverwaltung an. Die kann man auch schrittweise erweitern (andere Datenbank, GUI, ...) und merkt dann von alleine, ob sein Design gut war.
Das Leben ist wie ein Tennisball.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Auch total nett der Hinweis,

Könntest Du vielleicht auch so nett sein, mir Hilfe zu meinem speziellen Problem geben?
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

um es noch genauer zu formulieren, das Script soll noch ausgebaut werden, aber solange es an den Basics hakt, macht das keinen sinn.
Im übrigen habe ich versucht an diesem kleinen Beispiel das mcv umzusetzen.
Nochmals bitte: Ich brauche keine Kritik an dem was ich mache, sondern wie ich es mache....
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dein Problem liegt in Zeile 44:

Code: Alles auswählen

self.oMDL_GetVersion = MDL_GetVersion() 
Der Konstruktor von MDL_GetVersion erwartet bereits den Pfad. Dort gibt es dann gleich noch einen Fehler wegen des "none".
Bluekobalt hat geschrieben:Nochmals bitte: Ich brauche keine Kritik an dem was ich mache, sondern wie ich es mache....
Und wie Du es machst ist es eben wenig sinnvoll. Das sind alles Funktionen, mit Klassen und Kommunikation zwischen diesen, hat es wirklich gar nichts zu tun.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Uebrigens ist die Hungarian Notation keine gute Idee in dynamisch typisierten Sprachen. Nicht dass sie sonst eine gute Idee waere ... aber in Python schlaegt das besonders zu Buche, da Namen neu gebunden werden koennen und das ``o`` bei jedem Objekt, d.h. alles in Python, zutrifft.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Ey Du : Das war toll !

Danke für die Hilfe !

Ich weiss selber das das kein tolles Beispiel ist, aber als Anfänger hat man so ein code schnipsel vor sich und denkt man könne den mal schnell umschreiben. Ich wollte einfach nur die Klassen und deren Methoden aufrufen, bin hängengeblieben und habe mich halt festgefressen.
Es hat mir auch keine Ruhe gelassen.
Gelernt habe ich auf jedenfall davon und das ist doch die Hauptsache, oder?
Nochmals vielen Dank
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

@Cofi
Ich habe deinen Hinweis nicht so richtig verstanden, könntest du so nett sein, das etwas ausführlicher zu beschreiben, weil ich denke das es wichtig sein könnte....[/quote]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://en.wikipedia.org/wiki/Hungarian_notation

Wenn das ``o`` hier

Code: Alles auswählen

self.oMDL_GetVersion
nicht verdeutlichen soll, dass es eine Instanz ist, dann haette ich gerne eine Erklaerung warum das da ist ;)

Die Hungarian Notation ist die verschluesselte Variante von so elenden Namen wie ``name_list = list()``, dass spaetestens von ``name_list = dict()`` ad absurdum gefuehrt wird.

Vielleicht willst du auch [wiki]PEP 8 (Übersetzung)[/wiki] oder das Original lesen.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

okay in dem falle des selfs ist es vielleicht blöd ein "o" noch ranzuknallen, weil doppelgemoppelt.
in normalen objekten, der lessbarkeit wg. doch angebracht, oder?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wie soll das denn die Lesbarkeit verbessern? IMHO eher das Gegenteil, da der Leser nicht weiss, was der Kringel da zu suchen hat.

Was hat das ``o`` denn mit den ``self`` zu tun? Wieso soll das doppeltgemoppelt sein?

Die Lesbarkeit, liesse sich im Uebrigen weit besser mit einem sprechenden Namen (was _macht_ es, nicht was _ist_ es) erhoehen ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Bluekobalt hat geschrieben:in normalen objekten, der lessbarkeit wg. doch angebracht, oder?
Nein, das ist gegenläufig zum Typensystem von Python und eigentlich auch bei allen andern Sprachen wenig brauchbar. Bei dem vom Python genutzten Duck-Typing (benutze dazu mal Google) kommt es nicht darauf an, was für ein Typ ein Objekt hat, sondern was für eine Schnittstelle. Du könntest also zum Beispiel deine eigenen Listentyp implementieren, welcher die selbe Schnittstelle hat wie "list", und solltest diese dann überall nutzen können, wo Listen benötigt werden (ohne von "list" zu erben).

Es sollte bereits durch den Namen des Objekts klar werden, was man damit anstellen kann. Wenn du noch Zusätze brauchst, dann ist der Name meist ungünstig gewählt. Ganz problematisch wird es dann, wenn man von einer Liste zu einem Tupel wechselt. Dann müsste alles von "lName" auf "tName" umgestellt werden. Und was soll man erst bei Typen machen, welche man selber definiert hat? Da gibt es dann kryptische Ausdrücke, welche kein anderer mehr versteht und nachgeschlagen werden müssen.
Das Leben ist wie ein Tennisball.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Bluekobalt hat geschrieben:in normalen objekten, der lessbarkeit wg. doch angebracht, oder?
Alles was man an einen Namen binden kann ist ein Objekt, welche davon sind den jetzt normal bzw. unnormal?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Bluekobalt hat geschrieben:Nochmals bitte: Ich brauche keine Kritik an dem was ich mache, sondern wie ich es mache....
"Ich möchte diesen Nagel mit einem Akkuschrauber in die Wand bekommen. Ich brauche aber keine Kritik an dem was ich mache, sondern wie ich es mache."
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Also wenn der Akkuschrauber stabil genug ist, dann einfach damit kräftig auf den Nagel kloppen. ;-)

SCNR…
Antworten