Merkwürdiges Verhalten bei 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
CasualCoding.org

Hallo Forum!

Bei einer Aufgabe meines Lehrbuches bin ich gerade auf ein merkwürdiges Verhalten gestoßen. Oder ich habe einen Fehler, den ich gerade nicht sehe. Folgendes: Klasse A hat ein privates Attribut und eine entsprechende Getter-Methode:

Code: Alles auswählen

class A(object):
    def __init__(self, attribut):
        self.__attribut = float(attribut)

    def get_attribut(self):
        return self.__attribut
Klasse B ist von Klasse A abgeleitet und versucht nun, in ihrer __str__-Methode dieses Attribut zu verwenden:

Code: Alles auswählen

class B(A):
    def __init__(self, attribut):
        A.__init__(self, attribut)

    def __str__(self):
        return "Wert: " + str(self.get_attribut()) + " weiterer Text"
Wenn ich nun ein Objekt der Klasse B mittels print() ausgeben möchte, bekomme ich einen TypeError mit Angabe der Zeile aus der __str__-Methode: "can't convert float to str implicitly". Aber die Typumwadlung nehme ich doch vor? Hat das was mit der Vererbung zu tun und damit, dass das Attribut privat ist? Oder ist solches Verhalten eigentlich nicht erklärbar und ich habe wahrscheinlich einen Fehler, der mir nicht auffällt?
BlackJack

@SolitaryMan: Es würde helfen wenn Du den tatsächlichen Quelltext und den dazugehörigen Traceback zeigen würdest. Das hier funktioniert bei mir nämlich problemlos:

Code: Alles auswählen

from __future__ import absolute_import, division, print_function


class A(object):
    def __init__(self, attribut):
        self.__attribut = float(attribut)
 
    def get_attribut(self):
        return self.__attribut


class B(A):
    def __init__(self, attribut):
        A.__init__(self, attribut)
 
    def __str__(self):
        return "Wert: " + str(self.get_attribut()) + " weiterer Text"


def main():
    b = B(42.23)
    print(b)


if __name__ == '__main__':
    main()
Also musst Du ja irgend etwas anders machen.

Und `__attribut` würde ich nicht als ”privat” bezeichnen und ich würde das hier auch nicht machen. Ein einzelner Unterstrich reicht völlig aus, das mit den doppelten sollte man sich gar nicht erst angewöhnen um ”private” Attribute zu haben.
CasualCoding.org

Hallo BlackJack und danke für die Antwort. Hm... dann muss der Fehler woanders liegen. Ich schau mir das nochmal an. Den Original-Quelltext kann ich grade nicht posten, bin auf der Arbeit.

Achso, klar, dass die Sache mit privaten respektive pseudo-privaten Attributen in Python eher unerwünscht ist, habe ich bereits gelernt (ich lese ja auch hier in der Community fleißig mit). Bearbeite meine Lernquellen durchaus mit kritischer Distanz - das ist das, was ich hauptsächlich durch euch gelernt habe. Trotzdem möchte ich natürlich die Aufgaben entsprechend der geforderten Aufgabenstellung lösen, und wenn's nicht klappt, auch verstehen, warum es nicht klappt. Ob der entsprechende Mechanismus gerade eine bad practice ist oder nicht. Danke trotzdem für den Hinweis!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@SolitaryMan: Doppelte Unterstriche zur Vermeidung von Konflikten bei Mehrfachvererbung sind ja nicht unerwünscht, weil das gibt's ja in Python. Die falsche Annahme, es würde sich dabei um private Attribute handeln, und das Lehren dieser Annahme in diversen Tutorials und Büchern ist das Problem.
Das Üben von Unsinnigem ist selbst wieder unsinnig. Ich habe schon in der Schule ein gesundes Mißtrauen gegenüber pseudo-Autoritäten, wie Lehrer und Lehrbücher, gelernt. Selbst Denken steht aber zu oft nicht mehr auf dem Lehrplan.
CasualCoding.org

@Sirius - spannendes Thema und auch genau eines "meiner" Themen. Könnte ein spannendes Gespräch werden - passt hier nur leider nicht rein. ;-)
Antworten