Anfängerfrage class, self!

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
Nyrk
User
Beiträge: 16
Registriert: Freitag 17. April 2009, 22:18

Hallo,

ich habe z.B. folgenden Code:

Code: Alles auswählen

class Window:
	def __init__(self):
		self.xml = gtk.glade.XML(os.path.join(os.path.dirname(sys.argv[0]), 'foo.glade'))
		self.window = self.xml.get_widget('window1')
		#...
		self.window.show()
was ich dabei jetzt nicht verstehe ist class window, def __init__(self): und self.....

wenn ich das alles weglasse funktioniert es ja trotzdem...
kann mir das mal jemand vernünftig erklären?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Du solltest mit GUI erst anfangen, wenn du verstanden hast wie OOP in Python funktioniert und wie man eigene Klassen erstellt: http://docs.python.org/tutorial/classes.html
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

Klassen werden zur Übersichtlichkeit und wiederverwendbarkeit genuzt.

Wenn du uns also nen 100 Zeiliges programm in Prozeduraler schreibweise, wenig kommentaren zeigst, wird sich kaum einer dazu motiviern den Code durchzublicken zu wollen.

Ausserdem kannst du nutzung von OOP klassen in klassen vererben. In GUI Programmierung brauchst du das ganz oft, zB.: für das Threading(wenn du mehrere fenster offen haben willst die aber alle eigenständig aufgaben bewältigen)

Du solltest dir auf jeden fall ein gutes Tutorial auffinden in dem du alles von funktionen, methoden bis hin zu Klassen einlesen kannst

Aber bezüglich deiner Frage:

du hast eine Klasse mit einem Konstruktor, einer Methode die sofort aufgerufen wird, sobald du die Klasse startest, definiert.

Beispiel:

Code: Alles auswählen

class Test:
    def __init__(self):
        print "ich wurde erstellt"

c = Test()
durch die untere Zeile hast du automatisch die funktion __init__ausgeführt und da kannst du variablen der klasse definieren. Auch diese sehr strukturierte verteilung ist für GUI notwendig, sonst haste irgendwann mal "sehr viel spaß" beim debuggen.

Hoffe dir reicht das als antwort, dass du nicht denkst das hier "lies tutorials" ne standard antwort ist ;)

lg scrippi
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Nyrk hat geschrieben:wenn ich das alles weglasse funktioniert es ja trotzdem...
kann mir das mal jemand vernünftig erklären?
Ich vermute Mal du meinst:

Code: Alles auswählen

class Window:
	xml = gtk.glade.XML(os.path.join(os.path.dirname(sys.argv[0]), 'foo.glade'))
	window = self.xml.get_widget('window1')
		#...
	window.show()
Nun sobald ein Modul geladen (=die entsprechende Python-Datei ausgeführt) wird, und der Interpreter zu einer Klassendefinition kommt wird der Code innerhalb der Klassendefinition ausgeführt und die Namen an das Klassenobjekt gebunden. Das heißt dein Fenster wird schon erstellt sobald der Interpreter zu der Klasse kommt und nicht erst wenn du Window() aufrufst. Klassenvariable heißt, dass alle Instanzen dier Klassen diese sehen, so lange sie nicht bei der Instanz selbst überschrieben werden.

Code: Alles auswählen

class A:
    print "Hallo"
    foo = []
    def __init__(self):
        print "Bin da"
# Hallo wurde ausgegeben weil allen innerhalb der Klassendef
# ausgeführt wurde
a1 = A() # "Bin da"
a2 = A() # "Bin da"
a1.foo.append(1) # Verändern von foo
print a2.foo # In jeder Instanz sichtbar
a1.foo = [] # Überschreiben von foo in a1
print a2.foo # immer noch [1]
Nyrk
User
Beiträge: 16
Registriert: Freitag 17. April 2009, 22:18

Vielen dank, ich hatte mir dazu auch schon 2 open books angeschaut, leider aber im einzelnen nicht 100%ig verstanden.

Jetzt weiß ich so ungefähr wieso und weshalb ich Klassen nutzen sollte.

Gruß

Nyrk
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Aber hoffentlich nicht das von Galileo Computing :wink:
Nyrk
User
Beiträge: 16
Registriert: Freitag 17. April 2009, 22:18

doch Das :-) und a byte of python!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dann solltest das Kapitel über OOP übersprigen und dieses Thema lieber woanders lernen (z.B. Original-Tut).
Antworten