Seite 1 von 1
Fragen zu folgendem Script
Verfasst: Dienstag 14. August 2007, 15:06
von Markus12
Hi, ich lerne ja fleißig Python und bin bei den Klassen mittlerweile durch^^
Hier habe ich in meinem Buch ein Script gefunden, dass eigentlich "Standardklassen als Basisklassen" als Thema hat. Hier 'list'.
Erstmal das Script selber:
Code: Alles auswählen
class Defaultlist(list):
def __init__(self, s=[], default=0):
self.default=default
list.__init__(self, s)
def __getitem__(self, index):
try:
return list.__getitem__(self, index)
except:
return self.default
Das Script verhindert einen Laufzeitfehler, falls der Index bei einer Liste zu hoch ist und dieser Index nicht existiert. 'default' ist dabei der Wert, der zurückgegeben wird, falls dieser Fall eintritt, ansonsten wird der Wert des Indexes zurückgegeben.
Meine Fragen sind nun:
Zu...
Zeile1: Class Defaultlist(list) Heißt 'list', dass alle Methoden und Attribute von der Standardklasse 'list' an die Unterklasse 'Defaultlist' vererbt werden, damit man diese Methoden verwenden kann? Denke ich mal so.
Zeile5: Wieso wird hier die Klasse 'list' auf diese Weise initialisiert? Hier steht im Buch, dass das eine ungebundene Methode ist. Wat denn dada? ^^
Danke schonmal

Verfasst: Dienstag 14. August 2007, 15:27
von Zack
Hi Markus12
Ich werd mich mal versuchen.
Zu Zeile 1:
In der Zeile1 wird der Klasse Defaultlist() beim initialisieren etwas übergeben. Sieht später zb so aus:
Code: Alles auswählen
Defaultlist(list):
...
return ...
mylist = (....)
myclass = Defaultlist(mylist)
aus mylist wird dann in der Klasse list. Wobei list nicht unbedingt eine liste sein muss. Kann auch ein String sein. Es muss auch nicht zwangsweise list heißen.
Verfasst: Dienstag 14. August 2007, 15:41
von Markus12
Danke Zack, aber da hast du nicht ganz recht^^
1.
Stimmt nicht, denn eine Liste wird mit eckigen Klammern gebildet
2.
Kann auch nicht stimmen, denn beim Aufrufen von Defaultlist(mylist) wird die __init__ - Methode aufgerufen und somit ist s=mylist, weil das erste Argument der __init__ - Methode die variable 's' ist
Aber danke, dass du dich daran versucht hast und mir helfen wolltest!

Re: Fragen zu folgendem Script
Verfasst: Dienstag 14. August 2007, 15:52
von Rebecca
Markus12 hat geschrieben:Zeile1: Class Defaultlist(list) Heißt 'list', dass alle Methoden und Attribute von der Standardklasse 'list' an die Unterklasse 'Defaultlist' vererbt werden, damit man diese Methoden verwenden kann? Denke ich mal so.
Genau.
Markus12 hat geschrieben:Zeile5: Wieso wird hier die Klasse 'list' auf diese Weise initialisiert? Hier steht im Buch, dass das eine ungebundene Methode ist. Wat denn dada? ^^
Du erbst von der Klasse list alle Methoden und Attribute, eigentlich auch __init__. Aber um die Klasse den gewuenschten Anforderungen anzupassen, will man die urspruengliche __init__-Methode veraendern, also muss sie ueberschrieben werden. Nachdem man neue Attribute initialisiert hat (Zeile 3), will man, dass die DefaultList sich wie eine ganz normale Liste initialisiert, man ruft also die __init__-Methode der Klasse auf, von der man abgeleitet hat, naemlich von list. self.__init__(s) kann man ja nicht mehr schreiben, denn das ist die neu erstellte __init__-Methode.
"Ungebunde Methode" heisst, dass diese Methode kein Attribut von self ist, man muss ihr explizit self als erstes Argument uebergeben.
Verfasst: Dienstag 14. August 2007, 20:19
von Markus12
Die normale __init__ - Methode von list nimmt doch keine Argumente, richtig?
Und in Zeile 4 wird also die __init__ - Methode so verändert, dass sie ein Argument 's' fordert, richtig?
Aber wo wird dann - wie du sagst - die normale __init__ - Methode aufgerufen, also eine Liste erstellt? Das steht garnicht im Script drin!?
Verfasst: Dienstag 14. August 2007, 20:41
von Rebecca
Markus12 hat geschrieben:Die normale __init__ - Methode von list nimmt doch keine Argumente, richtig?
Doch, kann sie:
Docstring:
list() -> new list
list(sequence) -> new list initialized from sequence's items
Code: Alles auswählen
In [5]: list("hallo welt")
Out[5]: ['h', 'a', 'l', 'l', 'o', ' ', 'w', 'e', 'l', 't']
Markus12 hat geschrieben:Und in Zeile 4 wird also die __init__ - Methode so verändert, dass sie ein Argument 's' fordert, richtig?
Oehm, nein???
Markus12 hat geschrieben:
Aber wo wird dann - wie du sagst - die normale __init__ - Methode aufgerufen, also eine Liste erstellt? Das steht garnicht im Script drin!?
In Zeile vier wird die __init__ -Methode der builtin-Listenklasse aufgerufen, damit ein Objekt der Klasse DefaulLlist genauso initialisiert wird, wie es normale Listenobjekte werden.
Das Ueberschreiben der von list geerbten init-Methode geschieht dadurch, dass du ab Zeile 2 fuer die DefaultList eine eigene __init__-Methode definierst.
Verfasst: Dienstag 14. August 2007, 21:11
von Markus12
1. Das mit dem Argument für 'list()' ist mir klar. Ohne Argument wird eine leere Liste erstellt; mit übergebenen Argument wird z.B. ein Dictionary in eine Liste umgewandelt.
2.
Code: Alles auswählen
Aber um die Klasse den gewuenschten Anforderungen anzupassen, will man die urspruengliche __init__-Methode veraendern, also muss sie ueberschrieben werden.
lol Dann verstehe ich diesen Satz von dir nicht, wenn ich das, was du sagst, wiedergebe!
Ist aber auch egal
Verfasst: Dienstag 14. August 2007, 21:15
von Rebecca
Wahrscheinlich reden wir total aneinander vorbei.

Re: Fragen zu folgendem Script
Verfasst: Mittwoch 15. August 2007, 19:33
von Joghurt
Markus12 hat geschrieben:Das Script verhindert einen Laufzeitfehler, falls der Index bei einer Liste zu hoch ist und dieser Index nicht existiert.
Ja, aber es fängt
alle Exceptions ab. D. H. wenn du das Programm zum richtigen Zeitpunkt mit Ctrl-C abbrichst, gibt das Dictionary stattdessen einfach den Defaultwert zurück.
Es ist immer besser, auf genau die Exception zu reagieren, die man auch erwartet. Alle anderen sollte man in Ruhe lassen. In diesem Falle also statt "except:" ein "except IndexError:"