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?
Eingebaute Klassen erweitern?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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...
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...
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.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?
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"
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.