klasse um Methode 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
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Dienstag 26. April 2011, 15:34

Wenn ich einer bestehenden Klasse eine Methode hinzufügen möchte, wie stelle ich das an?
Konkret will ich aus einem Dictionary alle Elemente entfernen die nicht von einem bestimmten Typ (hier: wieder dict) sind.
das ganze wird häufiger benötigt und deshalb wäre ein 'Makro' hilfreich bzw. eben die Erweiterung der bestehenden Klasse dict.

Code: Alles auswählen

def exDicts(d):
    for key in d.keys():
            if not isinstance(d[key], dict):
                del d[key]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 26. April 2011, 15:38

Stichwort Vererbung. In diesem Falle solltest Du Dir mal das Modul UserDict angucken.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Dienstag 26. April 2011, 15:42

bei Vererbung müsste ich ja aber erst eine Klasse neu anlegen, oder?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 26. April 2011, 15:45

hypnoticum hat geschrieben:bei Vererbung müsste ich ja aber erst eine Klasse neu anlegen, oder?
Ja klar. Zumindest in Python; andere Sprachen erlauben die Erweiterung von Klassen auch zur Laufzeit, etwa JavaScript oder Ruby. Wobei auch bei diesen bereits bestehende Objekte die hinzugefügten Methoden nicht besitzen (iirc).

Wir hatten da neulich mal einen Thread zu dieser Thematik iirc, wie man das in Python ebenfalls hinbekommen kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Dienstag 26. April 2011, 15:48

ok, danke dann überleg ich mir was anders ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 26. April 2011, 15:50

Ha, da isser :-)

Was genau willst Du denn machen? Evtl. gibt es eine gute Alternative oder aber durch das spezielle Gesamtproblem würde sich eine eigene spezialisierte Klasse eh eignen. Wenn Du uns ein wenig mehr Infos gibst, kann man da sicherlich präzisere Tipps geben :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dienstag 26. April 2011, 15:50

Seit 2.6 gibt es im Modul collections ABCs: http://docs.python.org/library/collecti ... se-classes. Daher rate ich dazu, diese zu vrwenden statt UserDict. Die doku sagt auch:
Starting with Python version 2.6, it is recommended to use collections.MutableMapping instead of DictMixin
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Dienstag 26. April 2011, 15:57

muss weg melde mich morgen wieder ...
BlackJack

Dienstag 26. April 2011, 16:47

@hypnoticum: Tut es nicht auch eine Funktion wie im ersten Beitrag? Ob man die nun so aufruft oder als Methode aufrufen würde, macht ja keinen grossen Unterschied, oder?
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Mittwoch 27. April 2011, 07:46

@BlackJack
ja, mit einer Funktion habe ich es jetzt gemacht. Ich war mir nur nicht sicher, ob es ohne größeren Aufwand machbar gewesen wäre die Klasse dict zu erweitern. War mein erster Gedanke, aber so ist es auch OK.
Antworten