Eingebaute Klassen erweitern?

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
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

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?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Hi,

Leider nicht möglich. Ärgert mich auch etwas.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

Okay, damit hab ich schon fast gerechnet, als ich nichts gefunden habe. Danke für die Info.
johannes
User
Beiträge: 8
Registriert: Sonntag 6. November 2005, 17:37
Wohnort: München

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"

Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

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.
johannes
User
Beiträge: 8
Registriert: Sonntag 6. November 2005, 17:37
Wohnort: München

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.
Antworten