Seite 1 von 1

Problem mit Vererbung

Verfasst: Sonntag 20. Februar 2011, 17:19
von tjuXx
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

Re: Problem mit Vererbung

Verfasst: Sonntag 20. Februar 2011, 17:29
von 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.

Re: Problem mit Vererbung

Verfasst: Sonntag 20. Februar 2011, 17:47
von tjuXx
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 ??

Re: Problem mit Vererbung

Verfasst: Sonntag 20. Februar 2011, 18:19
von BlackJack
@tjuXx: Du müsstest entweder den Wert selber oder das Exemplar von `Klasse1` bei `Klasse2.__init__()` als Argument übergeben.

Re: Problem mit Vererbung

Verfasst: Sonntag 20. Februar 2011, 23:05
von tjuXx
jo, Danke!!!

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