Zeichenketten sollte man nicht wiederholt mit ``+`` zusammensetzen. Das ist ineffizient weil jedes mal eine neue Zeichenkette erstellt wird in die die am ``+`` beteiligten kopiert werden. Effizienter und idiomatischer ist es die Teilzeichenketten in einer Liste zu sammeln und dann mit der `join()`-Methode zusammenzusetzen. Wobei so etwas wie ``"".join(["Tel: ", self.tel, '\n'])`` allerdings wieder komisch aussieht, denn *dafür* gibt es die `format()`-Methode:
``'Tel: {}\n'.format(self.tel)``.
Und bei Adresse: Eine Adresse *ist* ein Adresszusatz? Eine Adresse *ist* Standortdaten? Du verwendest Vererbung schon wieder falsch. Eine Adresse *hat* einen Adresszusatz und Standortdaten, das ist Komposition und nicht Vererbung.
`isinstance()` ist ein „code smell”. Das ist ein Warnzeichen dass man etwas macht was nicht OOP ist und was in Python zudem das „duck typing” unterläuft. Benenne `daten` in `adressen` um und versuch nicht auf Teufel komm raus alles zu erlauben beziehungsweise einen Sinn zu geben. Dort muss man ein iterierbares Objekt mit Adressen übergeben können. Wenn jemand eine *einzelne* Adresse übergibt, dann ist das halt ein Fehler. Sieht als API sowieso komisch aus wenn man ein Adressen-Objekt aus einer einzelnen Adresse erstellen könnte. Wenn man das möchte braucht man ja nur ``[]`` um das Objekt zu setzen und schon hat man eine Liste mit einer Adresse. Die `Adressen.__init__()` wird dann zu einem Zweizeiler:
Code: Alles auswählen
def __init__(self, adressen=()):
self.adressen = list(adressen)
In der `str` ist das ``if`` unnötig. Wenn `self.adressen` leer ist, dann wird die Schleife ja auch ohne das ``if`` nicht durchlaufen.
`d` ist eine Adresse. Statt also ``Adresse.__str__(d)`` aufzurufen geht natürlich ``str(d)`` — genau dafür hat man die `__str__()`-Methode doch implementiert. `d` und `s` sind ausserhalb von Argumentlisten von ``lambda``-Funktionen, „list comprehensions”, und Generatorausdrücken keine akzeptablen Namen.
Und der `Kontakt` erbt auch schon wieder oder immer noch von `Adressen` statt ein Attribut davon zu haben.
Die Docstrings sind an der falschen Stelle. Die gehören unter die ``class``-Zeilen.