Seite 1 von 1
Eingebaute Klassen erweitern?
Verfasst: Montag 21. November 2005, 20:06
von mq
Moin,
ich hab eine kurze Frage, Google und die Boardsuche haben nichts brauchbares ausgespuckt (oder ich hab mal wieder unter Beweis gestellt, dass ich immer mit den falschen Begriffen suche):
ist es in Python möglich, Methoden von eingebauten Klassen zu überschreiben, so wie in Ruby?
Verfasst: Montag 21. November 2005, 20:11
von mitsuhiko
Hi,
Leider nicht möglich. Ärgert mich auch etwas.
Verfasst: Montag 21. November 2005, 20:20
von jens
Hm? Wieso sollte es nicht möglich sein???
Oder ist mit den "eingebauten" Klassen, binär-Module gemeint? In dem Falle, weiß ich es nicht genau.
Aber i.d.R. kannst du doch hingehen und dir die Klasse als unbound holen und Methoden, Variablen einfach mit was eigenes überschreiben...
Verfasst: Montag 21. November 2005, 20:52
von Leonidas
Nein, jedoch ging das mal vor einiger Zeit über über einen Hack.
Das habe ich übrigens
auch schon mal gefragt
Inzwischen, da ich mich auch einiges mit Ruby beschäftigt habe, verstehe ich auch die Beweggründe warum es in Python nicht möglich ist. Zuerst dachte ich, dass das eine Einschränkung des Interpreters ist, aber dann habe ich in der Python Mailingliste (Python oder Python-dav) dass dies doch möglich war. Denn beim Erweitern von Klasse, wie es in Ruby oft der Fall ist, gibt es natürlich auch Nachteile. Denn daduch kann es sein, dass man ein Modul lädt, das zum Beispiel einer String-Klasse eine Methode #do_sth() erstellt und man danach ein anderes Modul lädt, welches die String-Klasse auch um eine Funktion #do_sth() erweitert. Natürlich wird dass dann nicht funktionieren.
In dem Fall kann man in Python einfach sich die Klasse schnappen, von ihr vererben und diese neue Klasse benutzen. So schlimm ist der Weg auch nicht, er fühlt sich vielleicht sogar ein wenig "sauberer" an, aber das kann man wohl ach unter persönliche Präferenzen einordnen.
Verfasst: Dienstag 22. November 2005, 19:17
von mq
Okay, damit hab ich schon fast gerechnet, als ich nichts gefunden habe. Danke für die Info.
Re: Eingebaute Klassen erweitern?
Verfasst: Dienstag 22. November 2005, 20:57
von johannes
lumax hat geschrieben:Moin,
ich hab eine kurze Frage, Google und die Boardsuche haben nichts brauchbares ausgespuckt (oder ich hab mal wieder unter Beweis gestellt, dass ich immer mit den falschen Begriffen suche):
ist es in Python möglich, Methoden von eingebauten Klassen zu überschreiben, so wie in Ruby?
Naja kommt darauf an was genau du meinst. Wenn du das verhalten
jeder Liste ändern willst, geht dass leider nicht. Was jedoch ohne Problem möglich ist, eine Liste abzuleiten und zu erweitern.
Beispiel:
Code: Alles auswählen
class defaultlist(list):
__slots__ = ['default']
def __getitem__(self, pos):
try:
return super(defaultlist, self).__getitem__(item)
except IndexError:
return default
x = defaultlist()
x.default = "test"
assert x[0] == "test"
Verfasst: Dienstag 22. November 2005, 21:13
von mq
Ne, ich meinte schon das verhalten jeder Liste. Eben die fest eingebauten Typen. Dass man eigene Klassen aus eingebauten Klassen ableiten kann, war mir schon klar.
Verfasst: Dienstag 22. November 2005, 22:24
von johannes
lumax hat geschrieben:Ne, ich meinte schon das verhalten jeder Liste. Eben die fest eingebauten Typen. Dass man eigene Klassen aus eingebauten Klassen ableiten kann, war mir schon klar.
Dass man von Built-in Typen ableiten kann gibt es in Python erst seit 2.2 (Siehe
PEP 253. Es gibt immer noch viele Dokumente dir für soetwas auf UserList und UserDict verweisen.