Stringklasse überschreiben?

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
synopia
User
Beiträge: 17
Registriert: Mittwoch 1. März 2006, 19:47

Es ist ja in Python möglich, eine bestehende Klasse im Nachhinein abzuändern, so dass anschliessend auch alle anderen Klassen die Änderung nutzen. Folgendes Beispiel zum Verdeutlichen:

Code: Alles auswählen

class X:
    def foo(self):
        return "original foo in X"

class Y:
    def bar(self):
        x = X()
        return x.foo()
        
class X:
    def foo(self):
        return "new foo in X"
        
print Y().bar()
Ausgegeben wird "new foo in X". Soweit sogut. Ich möchte nun der Stringklasse eine Methode (zb "foo()") hinzufügen, so dass ich anschliessend folgendes aufrufen kann:

Code: Alles auswählen

class String:
    def foo(self):
        return "foobar!"

print "Hello World!".foo()
Leider funktioniert das so nicht. Geht das und wenn ja wie?

Danke für die Hilfe.
--
http://www.weltenwerk.net
^^
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Hi,

ich würde das so machen.

Code: Alles auswählen

class MyOwnString(str):
    def foo(self):
        print "mich gibts"
Halte es nicht so gut vorhandene Klassen direkt zu überschreiben, wobei dass ist wohl geschmacksache und kommt auf die Situation an.
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

synopia hat geschrieben:...
1.) das was du da machst ist nicht überschreiben. Überschrieben schaut so aus:

Code: Alles auswählen

>>> class C(object):
...     def foo(self):
...             print self.bar()
...     def bar(self):
...             return "C"
...
>>> def bar(self):
...     print "blub"
...
>>> C.bar = bar
>>> d = C()
>>> d.bar()
blub
2.) funktioniert das aus nicht mit builtin typen, stell dir vor ein modul würde das wie dein modul ein .foo von str überschreiben. Das wäre nicht sinnvoll?
TUFKAB – the user formerly known as blackbird
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Python kann das nicht.

Ruby kann das glaube ich.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Joghurt hat geschrieben:Python kann das nicht.
Können schon, aber erlauben nicht
Joghurt hat geschrieben:Ruby kann das glaube ich.
Jep. Aber auch dort sollte es nicht verwendet werden.
TUFKAB – the user formerly known as blackbird
synopia
User
Beiträge: 17
Registriert: Mittwoch 1. März 2006, 19:47

Ich will ja nix überschreiben, sondern einer Build-In-Klasse eine Methode hinzufügen. Schade eigentlich, ich fänd es so besser:

Code: Alles auswählen

"Hallo Welt! Umlaute sind blöde".unescape_html()
als:

Code: Alles auswählen

SomeUnicodeLib.unescape_html("Hallo Welt! Umlaute sind blöde")
Aber is schon recht. Danke für die Antworten :-D
--
http://www.weltenwerk.net
^^
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

synopia hat geschrieben:Ich will ja nix überschreiben, sondern einer Build-In-Klasse eine Methode hinzufügen.
Und wenn ein anderer auf die selbe Idee kommt? Genau das ist nämlich das Problem :-)
TUFKAB – the user formerly known as blackbird
synopia
User
Beiträge: 17
Registriert: Mittwoch 1. März 2006, 19:47

blackbird hat geschrieben:Und wenn ein anderer auf die selbe Idee kommt? Genau das ist nämlich das Problem :-)
Dann würde die Methode überschrieben werden, genau wie in deinem Beispiel oben. Zusätzlich sollte der Compiler/Interpreter eine Warning ausgeben oder sowas.

Aber ja, da müsste man auch Methoden umbennen können, sonst wäre es nur eine halbe Lösung...

Hach-hach...
--
http://www.weltenwerk.net
^^
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

In pypy geht das übrigens:

Code: Alles auswählen

>>>> from cgi import escape
>>>> str.htmlescape = escape
>>>> "<test>".htmlescape()
'<test>'
TUFKAB – the user formerly known as blackbird
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

synopia hat geschrieben:Ich will ja nix überschreiben, sondern einer Build-In-Klasse eine Methode hinzufügen. Schade eigentlich, ich fänd es so besser:
Wie gesagt, schau dir mal Ruby an, vielleicht sagt dir diese Sprache mehr zu
Antworten