Frage zu Startparametern

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
.exe
User
Beiträge: 27
Registriert: Mittwoch 14. Januar 2009, 11:16

Hallo,

ich habe mal ne Frage zu Parameterübergabe beim starten einer Python-Datei.Folgende Situation:

Python-Datei

Code: Alles auswählen

class TestClass():

    def main(param):
         print param
         if param == '-s':
            print "mach was"
    

if __name__ == '__main__':
    TestClass().main()
Ich versuche einen Wert beim starten der Datei mit python test.py -s ein parameter zu übergeben. Doch zu meiner Verwunderung ist "param" = <__main__.TestClass object at 0xb76aaacc>


Ich verstehe das nur nicht ;(. Mag mich da wer aufklären warum param nicht der Übergabewert ist :?:

Gruß

Sic
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo,

diese Ausgabe ist schon korrekt. Jede Methode bekommt als ersten Parameter ein Objekt von sich selbst mit übergeben.
Dieses Objekt wird überlicherweise per Konvention "self" genannt. Du kannst mit diesem Objekt auf andere Methoden, Variablen der Klasse zugreifen.

Um an die Parameter zu kommen, welche beim Start einer py-Datei mitgegeben werden, musst du sys.argv verwenden:

Code: Alles auswählen


import sys

class TestClass(object):
    def main(self):
        if sys.argv[1:]:
            print sys.argv[1]

sys.argv[0] ist der Name deines Skriptes.

Gruss
Martin
.exe
User
Beiträge: 27
Registriert: Mittwoch 14. Januar 2009, 11:16

Super dank dir vielmals für die Hilfe.

Das jede Methode ein Objekt von sich selbst übergibt wuste ich nicht.


Gruß

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

Code: Alles auswählen

if __name__ == '__main__':
    TestClass().main()
Dieser Aufruf sieht aber imho auch sonderbar aus! Hier wird man das Gefühl nicht los, dass Du eine Klasse als Modul missbrauchst. Wozu brauchst Du an der Stelle ein ungebundenes Objekt einer Klasse?

Das pythonische Idiom wäre doch eher so:

Code: Alles auswählen

def main():
    # hier dann der Einstieg in Funktionen usw.

if __name__ == '__main__':
    main()
Eine Klasse mit .main()-Methode sieht für mich jedenfalls sonderbar aus...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

.exe hat geschrieben:Ich verstehe das nur nicht ;(. Mag mich da wer aufklären warum param nicht der Übergabewert ist :?:
Warum sollte es so sein? Warum sollte gerade "-s" an die Methode übergeben werden? Du rufst sie ja völlig ohne Argument auf. Warum, in param das Objekt selbst gelandet ist, hat martin ja schon geschrieben.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

optparse bzw. argparse (py>2.6)

Könnten noch interessant für dich sein.
the more they change the more they stay the same
Antworten