Fragen zu folgendem Script

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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 :D
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

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.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Danke Zack, aber da hast du nicht ganz recht^^


1.

Code: Alles auswählen

mylist = (....)
Stimmt nicht, denn eine Liste wird mit eckigen Klammern gebildet ;)

2.

Code: Alles auswählen

myclass = Defaultlist(mylist)
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! :D
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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?

Code: Alles auswählen

man ruft also die __init__-Methode der Klasse auf
Aber wo wird dann - wie du sagst - die normale __init__ - Methode aufgerufen, also eine Liste erstellt? Das steht garnicht im Script drin!?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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:

Code: Alles auswählen

man ruft also die __init__-Methode der Klasse auf
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.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Wahrscheinlich reden wir total aneinander vorbei. :lol:
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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:"
Antworten