Klassen: Unterschiedliche Methoden für gleiche Instanzen
-
- User
- Beiträge: 94
- Registriert: Freitag 26. Oktober 2012, 15:35
- Wohnort: Hamburg
ja klar will ich die drei Dateien haben. aber in der einen steht dann halt nur die "Shape" Klasse. Ausserdem sind die Module für Wuerfel, Kugel usw. nicht autonom. Andersherum würde ich das "DRY" motto verletzen wenn ich die shape klasse in die module mit rein schreibe...na ja muss ich wohl so umständlich machen
-
- User
- Beiträge: 94
- Registriert: Freitag 26. Oktober 2012, 15:35
- Wohnort: Hamburg
@ pillmuncher: Warum hast du in der Shape-Klasse überall mit "@property" und nicht mit "def __init__(self)" gearbeitet?
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@schneitzmaster: Die property-Methoden in Shape, die keinen NotImplementedError schmeißen, stellen eine default-Implementierung dar, die von den abgeleiteten Klassen überschrieben werden können, die anderen müssen überschrieben werden, da in Shape keinerlei gerechtfertigten Annahmen darüber getroffen werden können, wie irgendeine konkrete Implementierung aussehen könnte. Man könnte es natürlich auch anders machen, aber so gefällt es mir besser, weil man beim Ableiten gleich sieht, was man implementieren muss.
In specifications, Murphy's Law supersedes Ohm's.
-
- User
- Beiträge: 94
- Registriert: Freitag 26. Oktober 2012, 15:35
- Wohnort: Hamburg
okay super danke.
Eine letzte Frage für heute habe ich noch. Ist es möglich in der Shape-Klasse beim initialisieren etwas zu übergeben?
In etwa so:
Eine letzte Frage für heute habe ich noch. Ist es möglich in der Shape-Klasse beim initialisieren etwas zu übergeben?
In etwa so:
Code: Alles auswählen
import numpy as np
class Shape(object):
def __init__(self,dim):
self.dim = dim
self.foo = []
def do_general_stuff(self):
if self.dim==3: # do stuff for only 3D
self.foo = np.array([1.,1.,1.])
elif self.dim==2: # do stuff for only 2D
self.foo = np.array([1.,1.])
class Wuerfel(Shape):
def __init__(self, kante):
self.kante = kante
self.mid = np.array( [0.,0.])
def do_specific_stuff(self):
self.do_general_stuff()
self.mid = self.kante*self.foo
Wuerfel_A = Wuerfel(kante=2.,dim=3)
Wuerfel_A.do_specific_stuff()
print Wuerfel_A.foo
Zuletzt geändert von schneitzmaster am Samstag 4. April 2015, 20:09, insgesamt 2-mal geändert.
@schneitzmaster: Wenn die `__init__()` der Basisklasse etwas wichtiges tut dann muss man die natürlich in der `__init__()` der abgeleiteten Klasse aufrufen. Also in der `Wuerfel.__init__()` beispielsweise ``Shape.__init__(self, …)``. Anstelle der Auslassungspunkte natürlich das was die Methode so erwartet.
Das mit dem ``if`` anhand der Dimension sieht mir eher nach weiteren Zwischenklassen aus, also zum Beispiel ``class Shape2D(Shape):`` und ``class Shape3D(Shape):``.
Das mit dem ``if`` anhand der Dimension sieht mir eher nach weiteren Zwischenklassen aus, also zum Beispiel ``class Shape2D(Shape):`` und ``class Shape3D(Shape):``.
-
- User
- Beiträge: 94
- Registriert: Freitag 26. Oktober 2012, 15:35
- Wohnort: Hamburg
@BlackJack: ja klar an die zwischenklassen hatte ich auch schon gedacht und dann weiter überlegt, dass es dann sehr verschachtelt wird. Da ich momentan nur eine Operation durchführen möchte wollte ich diese zusätzliche Verkomplizierung umgehen. Allerdings ist das Problem beim "momentan"
Mal schauen ich werde erst mal deinen Vorschlag umsetzen.
Mal schauen ich werde erst mal deinen Vorschlag umsetzen.