Anfängerproblem: Fehlermeldung " 'str' object is not callable"

Code-Stücke können hier veröffentlicht werden.
Antworten
Bloodpython
User
Beiträge: 1
Registriert: Sonntag 10. April 2022, 11:43

Hi, und erstmal vielen Dank für die Aufnahme ins Forum.
Ich programmiere jetzt seit 4-5 Tagen Python über jupyterlab und folge dabei einem Beginnerkurs. Ich habe dabei einen Code m.E. 1:1 übernommen, allerdings erhalte ich, im Gegensatz zum Video, eine Fehlermeldung. Die meisten Einträge bei google und im Forum überschreiten meinen Wissenshorizont, weswegen ich dabei wenig Hilfe gefunden habe. Hoffentlich könnt ihr mir helfen.
Generell geht es bei der Übung um Vererbung

Code: Alles auswählen

class Mannschaft():

    def __init__(self, dachverband, name):

        self.dachverband = dachverband

        self.name = name

    def name(self):

        return self.dachverband  + self.name

class MR_Mannschaft(Mannschaft):

    def __init__(self, dachverband, name, adresse):

        super().__init__(dachverband, name)

        self.adresse = adresse

       

    def name(self):

        return self.dachverband + " " + self.name + " " + self.adresse



holsatia = Mannschaft("Kösener Verband", "Corps Holsatia")   

bsc = MR_Mannschaft("BSCC", "BSC", "BSC-Straße")



print(bsc.name())


Daraus folgt diese Fehlermeldung

Code: Alles auswählen

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-fe7859720540> in <module>
----> 1 print(bsc.name())

TypeError: 'str' object is not callable
Ich verstehe nicht, warum das Video keinen Fehler bekommt, ich allerdings schon.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

self.name überschreibt dir deine Methode name, daher der Fehler.

Das ist allerdings auch spektakulär schlechter Code insgesamt, wenn das da so steht, selbst ohne den Fehler. Den Kurs würde ich eher abbrechen & zb das offizielle Python Tutorial durcharbeiten.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Methoden dürfen nicht so heißen wie Attribute, denn sonst werden die durch letztere verdeckt.
Es ist auch komisch, warum ein Name die Adresse enthält.
Statt dessen würde man die Methode __str__ implementieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In der `Mannschaft.__init__()` fehlt der Aufruf der `__init__()` per `super()`. Wenn man das so macht, muss man das überall so machen.

Bei `Mannschaft.name()` wird kein Leerzeichen zwischen die beiden Informationen gesetzt.

Werte und Zeichenketten mit ``+`` zusammenstückeln ist eher BASIC denn Python. In Python gibt es Zeichenkettenformatierung mit der `format()`-Methode und f-Zeichenkettenliterale.

Man benutzt keine kryptischen Abkürzungen in Namen. Was soll das `MR` in `MR_Mannschaft` bedeuten?

`MR_Mannschaft.name()` wiederholt einen Teil Code der schon in `Mannschaft.name()` steht. Da würde man diese Methode aufrufen, statt den Code zu wiederholen.

Code: Alles auswählen

#!/usr/bin/env python3


class Mannschaft:
    def __init__(self, dachverband, name):
        self.dachverband = dachverband
        self.name = name

    def __str__(self):
        return f"{self.dachverband} {self.name}"

#
# TODO Name ohne Abkürzung.
#
class MR_Mannschaft(Mannschaft):
    def __init__(self, dachverband, name, adresse):
        Mannschaft.__init__(self, dachverband, name)
        self.adresse = adresse

    def __str__(self):
        return f"{Mannschaft.__str__(self)} {self.adresse}"


def main():
    holsatia = Mannschaft("Kösener Verband", "Corps Holsatia")
    bsc = MR_Mannschaft("BSCC", "BSC", "BSC-Straße")

    print(holsatia)
    print(bsc)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten