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!
Cast in Python?
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)
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)
Warum willst Du das wissen?bigfrau hat geschrieben:Dann muss man kasten, um feststellen zu können , welche aus den Drei abgeleiteten Klassen ist dieser Object wirklich.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
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()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.
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.
- 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.
Python ist das hingegen schnuppe, denn hier wird erst zur Laufzeit versucht, x.foo zu finden.
x ist aber keine Instanz von A, sondern von X. Klingt für mich danach, als ob jemand nicht wüsste, was er will.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.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
- 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:
Der entsprechende Python-Code sieht so aus:
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;
}
Code: Alles auswählen
class Auto:
...
def __eq__(obj):
try:
return obj.kennzeichen==self.kennzeichen
except: #Objekt hat kein Kennzeichen
return False
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
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
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
Außerdem gibt es eine irrationale.
Wie man Fragen richtig stellt
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
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.Blattlaus hat geschrieben:Unter Java wird bei einem "==" die Methode equals aufgerufen,
Ausserdem ging es darum, zu erklaeren, warum man Typecastst in Java benoetigt. Die Implementierung der equals-Methode war nur ein Beispiel dafuer.
Ja stimmt, hatte mich vertan.Rebecca hat geschrieben: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.Blattlaus hat geschrieben:Unter Java wird bei einem "==" die Methode equals aufgerufen,
Java is lange her und außerdem eh blöd
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....
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....
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).Rebecca hat geschrieben:Was ich meine: In Java hat man zum Beispiel oft sowas: (equals)
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,
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.Ich kann nicht nachvollziehen, wie kann ich denn die Attributen von abgeleiteten generierten Klassen (A,B,C...) aus der Basisklasse rausbekommen....
Aufkeppla hat geschrieben:Auf welche Frage bezieht sich das?Joghurt hat geschrieben:Weil Java eine strongly typed language und Python eine weakly typed language ist.
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.
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.
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.