Seite 1 von 2

Cast in Python?

Verfasst: Montag 27. November 2006, 16:34
von bigfrau
Hi :)
Ich bin neu in Python,und wollte fragen : ist Cast wie in Java oder .Net auch in python möglich?
Ich habe z.B. eine Basis Klasse von der 3 weitere Klassen erben. Und als Rückgabe von der Methode wird der Object von dieser Basis Klasse zurückgeliefert. Dann muss man kasten, um feststellen zu können , welche aus den Drei abgeleiteten Klassen ist dieser Object wirklich.
Ich konnte bis jetzt nichts darüber in Python finden und wäre für jede Info dankbar!

Verfasst: Montag 27. November 2006, 16:48
von Blattlaus
In Python gibt es keine casts weil Python eine dynamisch Typisierte Sprache ist. Wenn du feststellen willst, welcher der 3 Klassen ein Objekt angehört, kannst du eingebaute Funktion isinstance benutzen.

Du solltest dir die Sprachprinzipien von Python mal genauer anschauen. Python ist nicht Java und deswegen macht es wenig Sinn, wenn du versucht mit Python wie mit Java umzugeben (zumal das eh selten bis garnicht unfktioniert)

Re: Cast in Python?

Verfasst: Montag 27. November 2006, 17:01
von N317V
bigfrau hat geschrieben:Dann muss man kasten, um feststellen zu können , welche aus den Drei abgeleiteten Klassen ist dieser Object wirklich.
Warum willst Du das wissen?

Re: Cast in Python?

Verfasst: Montag 27. November 2006, 17:41
von keppla
bigfrau hat geschrieben:Ich habe z.B. eine Basis Klasse von der 3 weitere Klassen erben. Und als Rückgabe von der Methode wird der Object von dieser Basis Klasse zurückgeliefert. Dann muss man kasten, um feststellen zu können , welche aus den Drei abgeleiteten Klassen ist dieser Object wirklich.
Ich verstehe das so: klassen A, B, C erben von X. Du hast eine ("die") Methode, die in java etwa so aussähe: public X getMysteriousObject()

Warum müsste man
a) in java casten, um rauszukriegen, was "genau" X jetzt ist? Dazu nutzt man doch auch in java "instanceof", und warum sollte man
b) das wissen wollen? Die Methode sichert dir ein X zu, du könntest ebenso ein Y extends X zurückbekommen, A,B,C sind lediglich Möglichkeiten.

Verfasst: Montag 27. November 2006, 21:40
von Joghurt
Weil Java eine strongly typed language und Python eine weakly typed language ist.

Verfasst: Montag 27. November 2006, 22:08
von keppla
Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
Auf welche Frage bezieht sich das?

Verfasst: Montag 27. November 2006, 22:23
von Rebecca
Naja, wenn du in Java eine Methode foo() in A (abgeleitet von X), aber nicht in X hast, dann kannst du auf der Instanz x von X nicht x.foo() aufrufen. Da meckert schon der Compiler, du musst x also vorher nach A casten, wenn es denn eine Instanz von A ist.

Python ist das hingegen schnuppe, denn hier wird erst zur Laufzeit versucht, x.foo zu finden.

Verfasst: Dienstag 28. November 2006, 09:11
von N317V
Rebecca hat geschrieben:Naja, wenn du in Java eine Methode foo() in A (abgeleitet von X), aber nicht in X hast, dann kannst du auf der Instanz x von X nicht x.foo() aufrufen. Da meckert schon der Compiler, du musst x also vorher nach A casten, wenn es denn eine Instanz von A ist.
x ist aber keine Instanz von A, sondern von X. Klingt für mich danach, als ob jemand nicht wüsste, was er will.

Verfasst: Dienstag 28. November 2006, 09:28
von Rebecca
Was ich meine: In Java hat man zum Beispiel oft sowas:

Code: Alles auswählen

class Auto {
public kennzeichen;
...
    public boolean equals(Object o){
        if (!(o instanceof Auto)) return false;
        Auto a=(Auto)o;
        return a.kennzeichen==this.kennzeichen;
}
Der entsprechende Python-Code sieht so aus:

Code: Alles auswählen

class Auto:
    ...
    def __eq__(obj):
        try:
            return obj.kennzeichen==self.kennzeichen
        except: #Objekt hat kein Kennzeichen
            return False

Verfasst: Dienstag 28. November 2006, 10:56
von N317V
Danke Rebecca! Ich weiß schon, warum ich mit Java nicht so richtig warm geworden bin.

Verfasst: Dienstag 28. November 2006, 11:25
von Rebecca
N317V hat geschrieben:Danke Rebecca! Ich weiß schon, warum ich mit Java nicht so richtig warm geworden bin.
Dabei habe ich noch gar nicht richtig angefangen... :wink:

Verfasst: Dienstag 28. November 2006, 11:35
von Blattlaus
Wieso, is doch genau die selbe Funktionsweise.
Unter Java wird bei einem "==" die Methode equals aufgerufen, unter Python die Methode __eq__.
Vim Prinzip her das selbe.

Verfasst: Dienstag 28. November 2006, 12:28
von N317V
Vom Prinzip her schon. Aber vergleich einfach mal den Code. Schon an so einem simplen Beispiel sieht man wie elegant Python im Vergleich zu Java ist. Sicher ist das hier noch extrem einfach. Hintergrund ist aber, dass Java mich mehr geistige Stabilität gekostet hat als jede andere Sprache, die ich gelernt hab. Inklusive C++ und Griechisch. :-) Wirkt vielleicht übertrieben, aber da reagier ich einfach irgendwie allergisch, wenn ich das lese.

Verfasst: Dienstag 28. November 2006, 12:33
von Rebecca
Blattlaus hat geschrieben:Unter Java wird bei einem "==" die Methode equals aufgerufen,
Falsch. "==" vergleicht immer, ob es sich bei zwei Objekten um dasselbe Objekt im Speicher handelt. Wenn du die equals-Methode benutzen willst, musst du sie als bla.equals(...) aufrufen.

Ausserdem ging es darum, zu erklaeren, warum man Typecastst in Java benoetigt. Die Implementierung der equals-Methode war nur ein Beispiel dafuer.

Verfasst: Dienstag 28. November 2006, 13:33
von Blattlaus
Rebecca hat geschrieben:
Blattlaus hat geschrieben:Unter Java wird bei einem "==" die Methode equals aufgerufen,
Falsch. "==" vergleicht immer, ob es sich bei zwei Objekten um dasselbe Objekt im Speicher handelt. Wenn du die equals-Methode benutzen willst, musst du sie als bla.equals(...) aufrufen.
Ja stimmt, hatte mich vertan.
Java is lange her und außerdem eh blöd ;)

Cast

Verfasst: Dienstag 28. November 2006, 15:43
von bigfrau
Danke für Information!
Ich habe gesehen , das man mit win32com.client Casten kann, aber kenne mich da nicht wirklich aus :(
Ich muss es kasten, weil ich eine SOAP Anbindung in Python an einen in JAVA geschriebenen Server schreibe (SOAP Doc/lit). Und das Problem ist, dass auf die Serviceanfrage, wird Objekt der Basisklasse zurückgelliefert. Dann muss ich kasten ob es von typ A, B oder C ist. Sonst habe ich keinen Zugriff auf die Attrbiten z.B. von A Klasse. Der instanceof würde mir nur sagen, ob das A, B oder C ist, aber ich würde immer noch keinen Zugriff auf die spezielle Attributen haben :(
Die klassen mit denen in in Python arbeite, wurden aus eine WSDL datei mit Hilfe von wsdl2py generiert. Ich kann nicht nachvollziehen, wie kann ich denn die Attributen von abgeleiteten generierten Klassen (A,B,C...) aus der Basisklasse rausbekommen....

Verfasst: Dienstag 28. November 2006, 16:37
von keppla
Rebecca hat geschrieben:Was ich meine: In Java hat man zum Beispiel oft sowas: (equals)
Damit hast du aber auch direkt eine Art Ausnahme gewählt, denn ausserhalb der equals-Geschichte ist es imho definitv schlechter stil, nach der Klasse zu Fragen (equals ist u.a. aufgrund der Bedingung der reflexivität etwas einzigartig).
Entweder, man hat eine Zusicherung, durch die man die Klasse kennt, oder man fragt das Objekt selber (also animal.canQuack() statt animal instanceof Duck). Das setzt natürlich voraus, dass man schon die Basisklasse informativ genug Programmiert hat, weshalb das vermehrte Auftreten von instanceof imho ein Indikator für ein anstehendes Refactoring ist,
Ich kann nicht nachvollziehen, wie kann ich denn die Attributen von abgeleiteten generierten Klassen (A,B,C...) aus der Basisklasse rausbekommen....
Gar nicht, dass ist ja der Punkt. Du kannst nicht mal sicher sein, dass du überhaupt ein A,B oder C zurückbekommst, es könnte ebensogut ein D extends X sein, wie gesagt.

Verfasst: Dienstag 28. November 2006, 21:57
von Joghurt
keppla hat geschrieben:
Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
Auf welche Frage bezieht sich das?
Auf
Warum müsste man
a) in java casten, um rauszukriegen, was "genau" X jetzt ist? Dazu nutzt man doch auch in java "instanceof", und warum sollte man
b) das wissen wollen? Die Methode sichert dir ein X zu, du könntest ebenso ein Y extends X zurückbekommen, A,B,C sind lediglich Möglichkeiten.

Verfasst: Dienstag 28. November 2006, 22:14
von Rebecca
Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
Laut Wikipedia ist Python stark und dynamisch typisiert.

Verfasst: Mittwoch 29. November 2006, 01:50
von BlackJack
Jup stimmt auch, der Unterschied zwischen Python und Java ist dynamisch vs. statisch und nicht schwach vs. stark.

Beide sind stark typisiert: wenn man etwas von einem Objekt will, dann muss das Objekt vom richtigen Typ sein, bzw. die Operation unterstützen.

Wobei statisch bei Java auch nicht ganz richtig ist. Man kann ja zur Laufzeit dynamisch casten, aber auch da wird, wie bei Python, dann zur Laufzeit geprüft, ob auch wirklich der richtige Typ vorliegt.