Seite 1 von 1

Objekt als anderes Objekt erstellen

Verfasst: Sonntag 1. November 2009, 14:03
von Twilo
Hallo,

ich erhalte von einer externen Methode ein eine Liste von Objekten zurück. Wie kann ich die zurückgegebenen Objekte als ein Object einer abgeleiteten Klasse erstellen lassen?

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 14:09
von Leonidas
Indem du es entweder konvertierst oder den ursprünglichen Code anpasst.

Verfasst: Sonntag 1. November 2009, 14:21
von Twilo
Hallo,

wie meinst du das mit dem Konvertieren?

Den ursprünglichen Code kann ich nicht anpassen, da der ursprüngliche Code in Java geschrieben ist.
Meine Klasse leite ich von einer Java-Klasse ab.

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 15:09
von Leonidas
Naja, angenommen du bekommst von der Klasse eine Liste, dann kannst du mit ``tuple(deine_liste)`` das Objekt in ein Tupel konvertieren... du müsstest halt mit ein paar Details mehr rausrücken, damit man dir spezifischere Sachen sagen kann.

Verfasst: Sonntag 1. November 2009, 15:50
von Twilo
Hallo,

ich erhalte eine Liste mit Objekten zurück
array(com.collabnet.ce.soap50.webservices.tracker.ArtifactSoapRow, [com.collabnet.ce.soap50.webservices.tracker.ArtifactSoapRow@18806f7, com.collabnet.ce.soap50.webservices.tracker.ArtifactSoapRow@1bd8993, com.collabnet.ce.soap50.webservices.tracker.ArtifactSoapRow@1dbac11])

class MeineKlasse(ArtifactSoapRow):
pass

wie kann ich aus der obigen Liste, z.B. folgende machen
[<__main__.MeineKlasse instance at 0x1013fc8>, <__main__.MeineKlasse instance at 0x1038638>, <__main__.MeineKlasse instance at 0x1038998>]

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 16:31
von BlackJack
@Twilo: Warum willst Du das machen? Wenn da nur ``pass`` drinsteht, ist das doch relativ witzlos!?

Könntest Du nicht einfach eine Wrapper-Klasse schreiben, die an die Objekte von Java weiterdelegiert?

Verfasst: Sonntag 1. November 2009, 17:31
von Twilo
Hallo,
BlackJack hat geschrieben:@Twilo: Warum willst Du das machen? Wenn da nur ``pass`` drinsteht, ist das doch relativ witzlos!?
das war jetzt nur ein sehr kurzes Beispiel ;-)

Könntest Du nicht einfach eine Wrapper-Klasse schreiben, die an die Objekte von Java weiterdelegiert?[/quote]
wie meinst du das?

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 17:41
von ms4py
Ganz einfach als Beispiel:
Du hast deine Java-Klasse A mit zwei Methoden method1, method2.

Code: Alles auswählen

class AWrapper(object):
    def __init__(self, wrapped_class):
        self.wrapped_class = wrapped_class
    def method1(self):
        return self.wrapped_class.method1()
    def method2(self):
        return self.wrapped_class.method2()
Denke mal mit diesem Beispiel ist das einigermaßen nachvollziehbar.

Verfasst: Sonntag 1. November 2009, 18:59
von Twilo
Hallo,

ich hatte eher an so etwas gedacht:
Object A ist jetzt vom Typ X

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 19:08
von Defnull
Woher soll Python denn wissen, wie man aus Objekten der Klasse A ein Objekt der Klasse B macht, wenn du es ihm nicht sagst? Mit Magie geht das sicher nicht :)

Verfasst: Sonntag 1. November 2009, 19:16
von Twilo
Hallo,
Defnull hat geschrieben:Woher soll Python denn wissen, wie man aus Objekten der Klasse A ein Objekt der Klasse B macht, wenn du es ihm nicht sagst? Mit Magie geht das sicher nicht :)
wenn Object A alle Methoden und Eigenschaften wie Typ X hat, sollte es doch gehen, oder?

Beispiel:

Code: Alles auswählen

class A:
  def test1(self):
    pass

class B(A)
  def test2(self):
    pass

a = A()
Aus ein A Objekt sollte doch ohne Probleme ein B Objekt machen lassen, oder irre ich mich?
Das aus ein B Objekt kein A Objekt werden kann, leuchtet mir ein ;-)

mfg
Twilo

Verfasst: Sonntag 1. November 2009, 19:29
von /me
Twilo hat geschrieben:

Code: Alles auswählen

class A:
  def test1(self):
    pass

class B(A)
  def test2(self):
    pass

a = A()
Aus ein A Objekt sollte doch ohne Probleme ein B Objekt machen lassen, oder irre ich mich?
Das aus ein B Objekt kein A Objekt werden kann, leuchtet mir ein ;-)
Das sehe ich genau andersherum. Ein Exemplar von B hat alle Informationen um ein Exemplar von A darstellen zu können. Umgekehrt gilt das nicht unbedingt.

Verfasst: Sonntag 1. November 2009, 20:35
von pillmuncher
Twilo hat geschrieben:wenn Object A alle Methoden und Eigenschaften wie Typ X hat, sollte es doch gehen, oder?
Wenn zwei Objekte dieselben Attribute haben, dann sind sie schon vom selben Typ. Beispiel:

Code: Alles auswählen

class X(object):
  def test(self):
    return "in X.test()"

class Y(object)
  def test(self):
    return "in Y.test()"

def print_test(o):
    print o.test()

x = X()
y = Y()

print_test(x)
print_test(y)
Das heißt Duck-Typing.
Twilo hat geschrieben:

Code: Alles auswählen

class A:
  def test1(self):
    pass

class B(A)
  def test2(self):
    pass

a = A()
Aus ein A Objekt sollte doch ohne Probleme ein B Objekt machen lassen, oder irre ich mich?
Ich weiß wirklich nicht, was du damit meinst, "aus einem A Objekt ein B Objekt machen". Ein Objekt ist, was es ist. Es hat Attribute, und die kann man sowieso zur Laufzeit ändern, man kann auch zur Laufzeit Methoden hinzufügen oder bestehende überschreiben, man kann sogar die Klasse wechseln, aber das Objekt bleibt es selbst und wird kein anderes. Du wirst ja auch nicht zu einer anderen Person, wenn du von der Goethe- in die Schillerstraße umziehst (aber dein Attribut "wohnt in" wird ein anderes). Mich würde wirklich interessieren, warum du da überhaupt irgendwas wechseln willst.
Twilo hat geschrieben:Das aus ein B Objekt kein A Objekt werden kann, leuchtet mir ein ;-)
Dann versuch mal:

Code: Alles auswählen

x = B()
x.__class__ = A
x.test2()
Gruß,
Mick.

Verfasst: Montag 2. November 2009, 12:38
von Twilo
Hallo,
pillmuncher hat geschrieben:
Twilo hat geschrieben:wenn Object A alle Methoden und Eigenschaften wie Typ X hat, sollte es doch gehen, oder?
Wenn zwei Objekte dieselben Attribute haben, dann sind sie schon vom selben Typ. Beispiel:

Code: Alles auswählen

class X(object):
  def test(self):
    return "in X.test()"

class Y(object)
  def test(self):
    return "in Y.test()"

def print_test(o):
    print o.test()

x = X()
y = Y()

print_test(x)
print_test(y)
Das heißt Duck-Typing.
ok
pillmuncher hat geschrieben:
Twilo hat geschrieben:

Code: Alles auswählen

class A:
  def test1(self):
    pass

class B(A)
  def test2(self):
    pass

a = A()
Aus ein A Objekt sollte doch ohne Probleme ein B Objekt machen lassen, oder irre ich mich?
Ich weiß wirklich nicht, was du damit meinst, "aus einem A Objekt ein B Objekt machen". Ein Objekt ist, was es ist. Es hat Attribute, und die kann man sowieso zur Laufzeit ändern, man kann auch zur Laufzeit Methoden hinzufügen oder bestehende überschreiben, man kann sogar die Klasse wechseln, aber das Objekt bleibt es selbst und wird kein anderes. Du wirst ja auch nicht zu einer anderen Person, wenn du von der Goethe- in die Schillerstraße umziehst (aber dein Attribut "wohnt in" wird ein anderes). Mich würde wirklich interessieren, warum du da überhaupt irgendwas wechseln willst.
ok, ich hatte mich wohl falsch Ausgedrückt, ich will dass das eine Objekt nicht mehr von der Klasse A sondern von der Klasse B ist. Mit __class__, wie du es weiter unten in ein Beispiel gezeigt hast, funktioniert das so weit ganz gut. Mit das zurückgegebene java-Objekt klappt das jedoch nicht.
Ich will eigentlich Methoden hinzufügen (bzw. ändern).

Wenn das auch irgendwie anders geht, bin ich ganz ohr :-)
pillmuncher hat geschrieben:
Twilo hat geschrieben:Das aus ein B Objekt kein A Objekt werden kann, leuchtet mir ein ;-)
Dann versuch mal:

Code: Alles auswählen

x = B()
x.__class__ = A
x.test2()
wenn ich das probiere, erhalte ich folgende Fehlermeldung:
artifact.__class__ = Test
TypeError: __class__ assignment: only for heap types
mfg
Twilo

Verfasst: Montag 2. November 2009, 13:28
von ms4py
Für deine Anforderungen ist IMHO eine Wrapper-Klasse am sinnvollsten. Wie das umzusetzen ist, habe ich bereits gepostet.

P.S. Bei mir funktioniert dieses Beispiel mit der Klasse ändern. (Bekomme natürlich den erwarteten ``AttributeError``) Hast du wohl nicht richtig umgesetzt. Deine Klasse ``Test`` müsste eine Basisklasse von ``artifact.__class__`` sein.

Verfasst: Montag 2. November 2009, 17:00
von BlackJack
@ice2k3: Du hast das auch mit Jython gemacht? Und versucht die Klasse eines Exemplars von einer *Java-Klasse* auf diese Weise zu ändern? Alternativ kannst Du es in CPython ja mal mit einer Klasse versuchen, die in C implementiert ist. Da gibt's auch genug Möglichkeiten mit der Technik aufzulaufen.

Verfasst: Dienstag 3. November 2009, 11:03
von Twilo
Hallo,
ice2k3 hat geschrieben:P.S. Bei mir funktioniert dieses Beispiel mit der Klasse ändern. (Bekomme natürlich den erwarteten ``AttributeError``) Hast du wohl nicht richtig umgesetzt. Deine Klasse ``Test`` müsste eine Basisklasse von ``artifact.__class__`` sein.
die Klasse Test ist von ArtifactSoapDO abgeleitet; der Rückgabewert soll laut Java-Doc vom Typ ArtifactSoapDO sein.

mfg
twilo

Verfasst: Dienstag 3. November 2009, 15:10
von ms4py
BlackJack hat geschrieben:@ice2k3: Du hast das auch mit Jython gemacht? Und versucht die Klasse eines Exemplars von einer *Java-Klasse* auf diese Weise zu ändern? Alternativ kannst Du es in CPython ja mal mit einer Klasse versuchen, die in C implementiert ist. Da gibt's auch genug Möglichkeiten mit der Technik aufzulaufen.
Ähm nein, aber es ging bei diesem Beispiel ja eigentlich auch nur darum, ihm zu zeigen, dass er gerade falsch herum gedacht hat...
Dass er das produktiv einsetzen soll hat ja wohl keiner behauptet, auf jeden Fall nicht ich ;)