Problem mit Vererbung

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
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

Hallo,

ich habe gerade ein Problem mit der Vererbung meiner Klassen. Ich habe eine Klasse Project und die Unterklasse Task.
Ich versuche jetzt während der Initialisierung der Basisklasse mehrere Instanzen der Unterklasse Task zu erzeugen. In der Klasse Task möchte ich jetzt, um die Name der Mitarbeiter zu bekommen auf das Attribut member der Basisklasse zugreifen.

Ich habe es bissher nicht hinbekommen.... Ist es so überhaupt möglich. Hier mal mein Code:

Code: Alles auswählen

class Project(object):

    def __init__(self, ID):
        #db = MySQLdb.connect( SET.dbHost, SET.dbCUser, SET.dbCPass, db='***')
        #c = db.cursor(); c.execute('SET time_zone = "CET"')
        #c.execute("SELECT * FROM project WHERE idproject=%s;",(ID))
        #PROJECT = c.fetchone()
        #c.close();db.close()
        #FAKE DATA
        PROJECT = ('Eintwicklung einer Trichtermehode für die Pharmazie','1,2,3')
        #GET MEMBER DATA
        MEMBER = {1:('Max Mustermann','Gruppenleiter-CAD', 'x@y.z', None, '0123123456'),
2:('Maxi Musterfrau','Projektleiter, Gruppenleiter-Corporate Management', 'x@y.z', None, '0123123456'),
3:('Dr. Mark Mustermann',None, 'x@y.z', '0123123456', '0123123456')}
        self.ID     = ID
        self.name   = PROJECT[0]
        self.member = MEMBER
        self.task   = []
        for task in PROJECT[1].split(','):
            self.task.append(Task(int(task)))
        return None

    def __del__(self):
        return None


class Task(Project):

    def __init__(self, ID):
        #db = MySQLdb.connect( SET.dbHost, SET.dbCUser, SET.dbCPass, db='***')
        #c = db.cursor(); c.execute('SET time_zone = "CET"')
        #c.execute("SELECT * FROM task WHERE idtask=%s;",(ID))
        #TASK = c.fetchone()
        #c.close();db.close()
        if   ID == 1: TASK = ('Hochbau der Fontaine','Hochbau der Fontaine im großen Garten, sowie der überwachung des ganzgen Areals mit Wärme und Sensor-Kameras','1,2,3','25.09.2012',1)
        elif ID == 2: TASK = ('TASK B','DECRIPTION B','1,3','15.06.2012',2)
        else          TASK = ('TASK C','DECRIPTION C','2','15.06.2012',3)
        self.ID          = ID
        self.title       = TASK[0]
        self.description = TASK[1]
        self.member_task = []
        for member in TASK[2].split(','):
            self.member_task.append(Project.member[int(member)][0])
        self.deadline    = TASK[3]
        self.state       = TASK[4]
        return None
BlackJack

@tjuXx: Wieso verwendest Du da überhaupt Vererbung? Ist ein `Task` denn ein `Project`? Das ist nämlich die Art von Beziehungen die mit Vererbung modelliert werden. Wenn ein `Project` aus `Task`\s *besteht*, dann ist das wohl eher Aggregation oder Komposition und keine Vererbungsbeziehung.

Da, zumindest laut Deinem Quelltext, ein `Task` ein `Project` ist, hat Dein `Task`-Exemplar auch das `member`-Attribut geerbt. Das Objekt hat also *selbst* (englisch: "self" ;-)) dieses Attribut. Aber wie gesagt -- das riecht irgendwie komisch.

Edit: `__init__()` sollte nichts zurück geben und `__del__()` sollte man auf keinen Fall in Python-Klassen implementieren und schon gar nicht dermassen sinnlos.
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

Da hast du recht. Natürlich ist ein Task kein Projekt. Ich dachte es wäre die einfachste Lösung das Attribut member zu übernehmen.

Hab nochmal eine ganz abgespeckte Version gemacht. Wie kann ich denn in folgendem Beispiel den Wert der Klasse1 übernehmen??

Code: Alles auswählen

class Klasse1(object):
    def __init__(self):
        self.value = 'WERT'
        self.unterklassen = []
        for x in range(2):
            self.unterklassen.append(Klasse2(x))

class Klasse2(object):
    def __init__(self, ID):
        self.ID = ID
        self.value = # Wert der Klasse1 Instanz ??
BlackJack

@tjuXx: Du müsstest entweder den Wert selber oder das Exemplar von `Klasse1` bei `Klasse2.__init__()` als Argument übergeben.
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

jo, Danke!!!

Manchmal sieht man vor lauter Bäumen den Wald kaum....
Antworten