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

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

Klingt voellig logisch. Ich kann mir aber im Moment gar nicht vorstellen, wie eine schwach typisierte Sprache aussehen soll?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Ihr habt ja recht. Ich sollte abends nicht mehr posten :wink:
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.
bigfrau
User
Beiträge: 3
Registriert: Montag 27. November 2006, 16:21

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

Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Antworten