Klassen und 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
Merlin-01
User
Beiträge: 2
Registriert: Donnerstag 10. Januar 2008, 19:37
Kontaktdaten:

Hallo zusammen,

leider habe ich ein kleines Problem - für das es sicher eine Lösung gibt.

Ich bin aktuell dabei eine Statemachine zu implemetieren. Dazu erstelle ich die Klasse "ZustandP2G" als Muster. Die Klasse "Start" erbt von "ZustandP2G" und soll nun nurnoch die Funktionen neu implemetieren, in denen sich das Verhalten von dem des Musters unterscheidet.

Code: Alles auswählen


class ZustandP2G(object):

    def __init__(self):
        print("Konstruktor ZustandP2G")

    def __default(self):
        print("default ZustandP2G")

    def schwarz(self):
        print("Schwarz ZustandP2G")
        self.__default()

    def weis(self):
        print("Weis ZustandP2G")
        self.__default()

class Start(ZustandP2G, object):

    def __init__(self):
        print("Konstruktor Klasse Start")

    def __default(self):
        print("Default der Klasse Start")

    def weis(self):
        print("Weis der klasse Start")
        self.__default()

Der Aufruf könnte so aussehen:

Code: Alles auswählen


if __name__ == '__main__':
    test = Start()
    test.weis()
    test.schwarz()
Nun möchte ich die Funktion schwarz() immer sie funktion default() aufrufen. Jedoch nicht mehr die der Klasse "ZustandP2G" sondern der Klasse "Start", da diese dort neu definiert worden ist.

Die Konsolenausgabe soll also nun so aussehen:

Code: Alles auswählen

Konstruktor Klasse Start
Weis der klasse Start
Default der Klasse Start
Schwarz ZustandP2G
Default der Klasse Start
Wie muss ich die Funktion default() ändern, damit das Funktioniert ?
Ich nutze Python 3.4

Mir fällt momentan kein Stichwort ein unter dem ich suchen könnte.
Oder habe ich einen Denkfehler und das ganze geht so gar nicht ?

Viele Dank schon mal für eure Hilfe

Merlin-01
Zuletzt geändert von Merlin-01 am Freitag 8. Mai 2015, 20:17, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Merlin-01: Du mußt einfach nur die unsinnigen doppelten Unterstriche vor __default weglassen.
Merlin-01
User
Beiträge: 2
Registriert: Donnerstag 10. Januar 2008, 19:37
Kontaktdaten:

Vielen Dank Sirius3.

:shock: Wow so einfach....ich hätte jetzt nicht gedacht das es daran liegt....
Wobei wenn ich so drüber nachdenke - geschütze Funktionen...

Nochmals vielen vielen Dank. Jetzt funtioniert es. :D
BlackJack

@Merlin-01: Das sind keine ”geschützten Funktionen”, das ist ein Mechanismus um Namenskollisionen bei Mehrfachvererbung zu verhindern, also etwas was Du überhaupt nicht benötigst. So etwas wie Zugriffsschutz wie ``private`` oder ``protected`` aus anderen Programmiersprachen gibt es in Python nicht. *Ein* führender Unterstrich wird per Konvention verwendet um dem Leser mitzuteilen dass es sich um ein Implementierungsdetail und nicht um einen Teil der öffentlichen API handelt.

Weitere Anmerkungen: `__init__()` ist kein Konstruktor sondern eine Methode die ein bereits existierendes Objekt *initialisiert* — daher auch der Name. Es gibt auch einen Konstruktor: `__new__()`, den man aber nur in sehr wenigen Fällen selber implementiert.

Die Farbe heisst `weiss` mit zwei 's'.

Wenn man die `print()`-Aufrufe nicht braucht und in der Basisklasse bei beiden Methoden tatsächlich 1:1 das `_default()`-Verhalten gefragt ist, kann man sich den indirekten Aufruf sparen:

Code: Alles auswählen

class ZustandP2G(object):
 
    def __init__(self):
        print('Init ZustandP2G')
 
    def _default(self):
        print('default ZustandP2G')
 
    schwarz = weiss = _default
Antworten