Seite 1 von 2

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.

Verfasst: Mittwoch 29. November 2006, 08:32
von Rebecca
Klingt voellig logisch. Ich kann mir aber im Moment gar nicht vorstellen, wie eine schwach typisierte Sprache aussehen soll?

Verfasst: Mittwoch 29. November 2006, 08:38
von Leonidas
Rebecca hat geschrieben:Ich kann mir aber im Moment gar nicht vorstellen, wie eine schwach typisierte Sprache aussehen soll?
Wie PHP oder Visual Basic. Das sind eben schwach typisierte Sprachen.

Verfasst: Mittwoch 29. November 2006, 09:17
von Joghurt
Ihr habt ja recht. Ich sollte abends nicht mehr posten :wink:

Verfasst: Mittwoch 29. November 2006, 10:04
von BlackJack
Rebecca hat geschrieben:Klingt voellig logisch. Ich kann mir aber im Moment gar nicht vorstellen, wie eine schwach typisierte Sprache aussehen soll?
Wie wär's mit C.

Wenn Du in Java `Viking` zu `Object` und dann zu `Duck` castest dann wird der zweite Cast in einer Fehlermeldung enden bevor du auf das `quack`-Attribut zugreifen kannst.

In C kannst Du einen Pointer auf eine `viking` Struktur einfach nach `duck*` casten und auf die, wahrscheinlich falschen, Elemente zugreifen.

In stark typisierten Sprachen "wissen" die "Objekte" selbst welchen Typ sie haben, in schwach typisierten Sprachen entscheiden die Funktionen/Prozeduren wie sie ein "Objekt" sehen wollen.

Attributen auslesen...

Verfasst: Mittwoch 29. November 2006, 13:34
von bigfrau
weiss jemand, wie man in diesem Fall auf die "fields" zugreifen kann? Wenn man beispielsweise Object dieser TransferableGenericDataObject_Def Klasse bekommt, dann wie kann man auf diese TClist zugreifen und elemente daraus lesen?
Es geht dabei also nur auf die Attributen zu zugreifen die eigentlich da sind, nur wie kann man die Abfragen, aus dieser merkwürdien Liste?

die Klasse von der TransferableGenericDataObject_Def erbt ist DataObject_Def und ist auch unten zu sehen:

Code: Alles auswählen

class TransferableGenericDataObject_Def(TypeDefinition):
        #complexType/complexContent extension
        schema = "http://schema.eim.cas.de"
        type = (schema, "TransferableGenericDataObject")
        def __init__(self, pname, ofwhat=(), extend=False, restrict=False, attributes=None, **kw):
            ns = ns0.TransferableGenericDataObject_Def.schema
            TClist = [GTD("http://schema.eim.cas.de","Field",lazy=False)(pname=(ns,"fields"), aname="_fields", minOccurs=0, maxOccurs="unbounded", nillable=False, typed=False, encoded=kw.get("encoded"))]
            attributes = self.attribute_typecode_dict = attributes or {}
            if extend: TClist += ofwhat
            if restrict: TClist = ofwhat
            if ns0.DataObject_Def not in ns0.TransferableGenericDataObject_Def.__bases__:
                bases = list(ns0.TransferableGenericDataObject_Def.__bases__)
                bases.insert(0, ns0.DataObject_Def)
                ns0.TransferableGenericDataObject_Def.__bases__ = tuple(bases)

            ns0.DataObject_Def.__init__(self, pname, ofwhat=TClist, extend=True, attributes=attributes, **kw)



class DataObject_Def(ZSI.TCcompound.ComplexType, TypeDefinition):
        schema = "http://schema.eim.cas.de"
        type = (schema, "DataObject")
        def __init__(self, pname, ofwhat=(), attributes=None, extend=False, restrict=False, **kw):
            ns = ns0.DataObject_Def.schema
            TClist = [ZSI.TC.HexBinaryString(pname=(ns,"id"), aname="_id", minOccurs=1, maxOccurs=1, nillable=True, typed=False, encoded=kw.get("encoded")), GTD("http://schema.eim.cas.de","AlphaString",lazy=False)(pname=(ns,"objectType"), aname="_objectType", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded"))]
            self.attribute_typecode_dict = attributes or {}
            if extend: TClist += ofwhat
            if restrict: TClist = ofwhat
            ZSI.TCcompound.ComplexType.__init__(self, None, TClist, pname=pname, inorder=0, **kw)
            class Holder:
                typecode = self
                def __init__(self):
                    # pyclass
                    self._id = None
                    self._objectType = None
                    return
            Holder.__name__ = "DataObject_Holder"
            self.pyclass = Holder


Verfasst: Donnerstag 30. November 2006, 14:51
von keppla
Ist nicht gegen dich persönlich gerichtet, aber der Code, den du da gepostet hast, kommt direkt aus der Hölle. Ich befürchte, bevor du ihn nicht irgendwie verständlicher machst, werde ich nicht der einzige sein, der ihn nicht versteht, und dir deshalb nicht helfen kann.