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.
@schneitzmaster: Ich bin mir nicht sicher was ich darauf antworten soll. Was Du da anscheinend versuchst ist so nicht vorgesehen. Man würde gleich ein `triangle`-Objekt erstellen und nicht nachträglich aus einem `Shape` versuchen ein `triangle` zu machen. Und dann hat man alle Attribute wenn man in der Unterklasse in der `__init__()` die `__init__()` der Basisklasse aufruft. Das fehlt in Deinem Beispiel.
@schneitzmaster
Irgendwo muss ja eine Verbindung zwischen `Triangle` und `Shape` entstehen, was in Deinem Beispiel nicht der Fall ist. So sollte es aussehen:
@BlackJack: Ich hab mir schon gedacht, dass es nicht vorgesehen ist. Vielleicht ist mein Ansatz ja der Falsche, um das Problem zu lösen. Was ich machen möchte, an dem gewählten Beispiel erklärt:
Ich habe eine Shape-"Oberklasse". Dieser weise ich Attribute zu. Im Verlauf des Programmes iniziere ich eine Shape-Instanz (abstract_shape). Dann werden diverse Operationen ausgeführt, die unteranderem dazu führen, dass abstract_shape eine Farbe zu gewiesen wird (red). Dann wird weiterentschieden ob aus der Form noch ein Dreieck wird oder vielleicht auch ein Kreis usw. Dabei möchte ich die in abstract_shape schon gespeicherten Attribute auf die nächste Instanz (triangle) vererben. Alles noch mal ausrechnen mit den Methoden von Shape wäre zusätzlicher Rechenaufwand. Da erst im Verlauf des Programmes das Attribut zugewiesen wird, kann ich das nicht schon bei der Definition der Klasse machen. Geht das irgendwie elegant über Vererbung oder ist Vererbung nur als etwas abstractes in der Definition von Objekten zu betrachten.
@mutetella: die verbindung zwischne Triangle und Shape ist ja durch Triangle(Shape) gegeben (dachte ich zu mindest).
@schneitzmaster: Das was Du machen willst hat nichts mit Vererbung zu tun. Das sieht eher wie das „builder pattern” aus. Oder vielleicht auch etwas ganz anderes, je nachdem welches Problem da *tatsächlich* gelöst werden soll.
@schneitzmaster
Ein Exemplar (Instanz) ist eine zum Leben erweckte Klasse. Alles, was der (Klassen-)Bauplan beinhaltet, ist selbstverständlich beim Exemplar vorhanden und im Falle der Methoden auch erst dort verwendbar:
>>> class Dog(object):
... def __init__(self, age):
... self.age = age
... def bark(self):
... if self.age == 'puppy'
... print 'wow-wow-wow-wow'
... else:
... print 'WUFF'
...
>>> Dog.bark()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method bark() must be called with Dog instance as first argument (got nothing instead)
>>> dog = Dog('puppy')
>>> dog.bark()
wow-wow-wow-wow
Das ... (got nothing instead) ... in der Fehlermeldung sagt eigentlich alles aus!
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Imho musst Du Dir erst einmal klar werden, *inwiefern* Deine Entitäten zueinander in Beziehung stehen. Sind das "Ist ein" oder "hat ein"-Beziehungen. Das ist i.A. ein brauchbarer Weg, um abzuschätzen, welche Entitäten durch Vererbung miteinander verbunden sind und welche besser durch Komposition verbunden werden sollten.
@darktrym: Der Artikel hat als einzige Literaturquelle „Die C++ Programmiersprache“ von Stroustrup. Und bei C++ braucht man den Copy-Konstruktor beziehungsweise muss zumindest wissen was das ist weil der für so etwas grundlegendes wie einfache Zuweisungen und Parameterübergaben wichtig sein kann. In Java hat `Object` eine `clone()`-Methode, weshalb man dort auch selten bis gar keine Copy-Konstruktoren sieht, und wenn, dann oft von C++-Programmierern die Java lernen (oder C++ in Java-Syntax schreiben wollen ). Die englischsprachige Wikipedia hat ein eigenes Lemma für „Copy constructor (C++)“ — eben weil das in C++ etwas besonderes/wichtiges ist.
darktrym hat geschrieben:Da das Wort nicht einmal gefallen ist, das nennt sich Copy-Konstruktor.
Auch wenn schon geklärt worden ist, dass das kein pythonischer Begriff ist: Was meinst Du denn mit *das*? Also welche Sache in welchem Teil des Threads hier würdest Du so nennen?
Stimmt, aber die Absicht war erkennbar. Man wollte die Belegung der Instanz mit der Erzeugung einer neuen abgleichen. Das funktioniert zmd. so nicht unter C++.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008] Bitbucket, Github