Objekt als anderes Objekt erstellen

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.
Antworten
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Indem du es entweder konvertierst oder den ursprünglichen Code anpasst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
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?
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

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

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

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 :)
Bottle: Micro Web Framework + Development Blog
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1531
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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