Klassen: Unterschiedliche Methoden für gleiche Instanzen

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

@schneitzmaster: Man könnte auch alles in eine schreiben. Oder in zwei.
schneitzmaster
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
schneitzmaster
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?
Benutzeravatar
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.
schneitzmaster
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:

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

@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):``.
schneitzmaster
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" :roll:
Mal schauen ich werde erst mal deinen Vorschlag umsetzen.
Antworten