Cast in Python?

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.
bigfrau
User
Beiträge: 3
Registriert: Montag 27. November 2006, 16:21

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!
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

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)
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Weil Java eine strongly typed language und Python eine weakly typed language ist.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
Auf welche Frage bezieht sich das?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Danke Rebecca! Ich weiß schon, warum ich mit Java nicht so richtig warm geworden bin.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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:
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

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.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

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.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

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 ;)
bigfrau
User
Beiträge: 3
Registriert: Montag 27. November 2006, 16:21

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....
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
Laut Wikipedia ist Python stark und dynamisch typisiert.
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.
Antworten