Seite 1 von 1

Stringklasse überschreiben?

Verfasst: Donnerstag 2. März 2006, 16:40
von synopia
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.

Verfasst: Donnerstag 2. März 2006, 17:29
von mr.hide
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.

Re: Stringklasse überschreiben?

Verfasst: Donnerstag 2. März 2006, 17:40
von mitsuhiko
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?

Verfasst: Donnerstag 2. März 2006, 18:47
von Joghurt
Python kann das nicht.

Ruby kann das glaube ich.

Verfasst: Donnerstag 2. März 2006, 18:53
von mitsuhiko
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.

Verfasst: Donnerstag 2. März 2006, 20:15
von synopia
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

Verfasst: Donnerstag 2. März 2006, 20:29
von mitsuhiko
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 :-)

Verfasst: Donnerstag 2. März 2006, 20:34
von synopia
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...

Verfasst: Donnerstag 2. März 2006, 20:39
von mitsuhiko
In pypy geht das übrigens:

Code: Alles auswählen

>>>> from cgi import escape
>>>> str.htmlescape = escape
>>>> "<test>".htmlescape()
'<test>'

Verfasst: Donnerstag 2. März 2006, 21:27
von Joghurt
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