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

Montag 27. November 2006, 16:34

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

Montag 27. November 2006, 16:48

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

Montag 27. November 2006, 17:01

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

Montag 27. November 2006, 17:41

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

Montag 27. November 2006, 21:40

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

Montag 27. November 2006, 22:08

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:

Montag 27. November 2006, 22:23

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

Dienstag 28. November 2006, 09:11

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:

Dienstag 28. November 2006, 09:28

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

Dienstag 28. November 2006, 10:56

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:

Dienstag 28. November 2006, 11:25

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

Dienstag 28. November 2006, 11:35

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

Dienstag 28. November 2006, 12:28

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:

Dienstag 28. November 2006, 12:33

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

Dienstag 28. November 2006, 13:33

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 ;)
Antworten