Vererbung mit Komposition Python

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.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Hallo lieber Mitglieder,
ich schreibe morgen eine Klausur über Python und habe ein kleines Problem. WIr sollen ein Diagramm interpretieren können und es in ein Code umschreiben . Hier der folgende Code in Aggregation:

Code: Alles auswählen

# Aggregation
class Tier():
    def __init__(self, tierart, name, einlieferungsdatum, tier_id):
        self.tierart = tierart
        self.name = name
        self.einlieferungsdatum = einlieferungsdatum
        self.tier_id = tier_id

# Halter der Aggregation
class Tierheim():
    def __init__ (self, Tierheim_Name, Tier):
        self.Tierheim_Name = Tierheim_Name
        self.Tier = Tier
        self.liste_tiere = []

    def add_Tier(self, tier):
        self.liste_tiere.append(tier)
    
    def get_Tier(self):
        for i in range(0,(len(self.liste_tiere))):
            print(self.liste_tiere[i].name)
        self.anzahl_Tiere = len(self.liste_tiere)
        print(self.anzahl_Tiere)
# Um auf die Atribute zugreifen zu können

#Kindklasse
class Säugetiere(Tier):
    def __init__(self, säuger_Klasse, tierart, name, einlieferungsdatum, tier_id):
        super().__init__(tierart, name, einlieferungsdatum, tier_id)
        self.säuger_Klasse = säuger_Klasse

#Kindklasse
class Voegel(Tier):
    def __init__ (self, flugfähig, schnabelfarbe, tierart, name, einlieferungsdatum, tier_id):
        super().__init__(tierart, name, einlieferungsdatum, tier_id)
        self.flugfähig = flugfähig
        self.schnabelfarbe = schnabelfarbe

#Kindklasse 
class Fische(Tier):
    def __init__(self, lebensraum, fischart, tierart, name, einlieferungsdatum, tier_id):
        super().__init__(tierart, name, einlieferungsdatum, tier_id)
        self.lebensraum = lebensraum
        self.fischart = fischart

#Tiere
affe = Säugetiere('Pflanzentiere', 'Säugetier', 'koko', '10.12.2014', 18874)
fisch = Fische('Süßwasser', 'Raubfisch','fisch', 'Nemo','20.05.2010', 17896)
vogel = Voegel(True,'blau','vogel','sky','02.12.2018', 147896)

# Tierheim
tierheim_a = Tierheim('AAAA', vogel)

#Tiere hinzufügen
tierheim_a.add_Tier(affe)
tierheim_a.add_Tier(fisch)
tierheim_a.add_Tier(vogel)

tierheim_a.get_Tier()

Unser Dozent meinte, wir sollen diesen Code noch als Komposition mitbringen, leider habe ich gar keine Ahnung wie ich diesen Code in Komposition umschreiben kann. Ich hoffe Ihr könnt mir bis morgen weiter helfen. Ich bin langsam am verzweifeln.
Ich bedanke mich schon jetzt für eure Hilfe und hoffe, dass einer es mir schreiben kann wenn Zeit und Lust bestehen sollte.

Mit lieben Grüßen
Kusja
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft selbst code-tags verwenden. Das ist der </>-Knopf im vollstaendigen Editor. Dann haelst du Namenskonventionen nicht ein und benutzt anti-pattern zum iterieren ueber die Liste der Tiere.

Und das Tierheim hat einen dicken Fehler: du uebergibst ein Tier bei Konstruktion. Wenn man ein Tierheim baut, ist dann da schon ein Tier drin? Und wenn dem so waere, ist das Tier dann irgendwie in einem besonderen Platz, oder da, wo alle anderen Tiere auch stecken? Warum ist das also bei dir anders?

Wenn dein Dozent von Komposition redet, hast du dann eine Definition fuer mich, was das bedeutet? Und wovon sich das abgrenzt?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe nicht, wie da was komponiert werden kann, denn ein Fisch IST ein Tier.
Variablennamen schreibt man komplett klein: tierheim_name, bzw. tier, dort wo es nicht die Klasse Tier meint, denn wie soll man die beiden bei Dir unterscheiden?
Warum hat das Tierheim ein Tier-Attribut? ›liste_tiere‹ sollte einfach nur ›tiere‹ sein.

›get_Tier‹ ist eine ganz seltsame Methode. Die Methode gibt etwas aus, also kein `get`, sondern ein `print`. Und dann wird da nicht nur ein Tier sondern alle Tiere ausgegeben, also ›print_tiere‹, wenn man unbedingt englisch und deutsch mischen will.
for-Schleifen über einen Index macht man in Python nicht, weil man direkt über die Elemente der Liste iterieren kann. `anzahl_Tiere` ist ein Attribut, das neu angelegt wird, alle Attribute sollten aber schon in __init__ angelegt werden. Zudem ist dieses Attribut völlig überflüssig, weil die Länge ja schon in der Liste abfragbar ist.

Code: Alles auswählen

    def print_tiere(self):
        for tier in self.liste_tiere:
            print(tier.name)
        print(len(self.liste_tiere))
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Vielen ieben Dank für deine schnelle Antwort. Ich habe den Code so von unserem Dozenten übernommen und bin selbst sehr verwirrt warum, wieso, weshalb. Und kann mir das einfach nicht erklären wie man diesen Code in Komposition umwandelt bzw. umschreibt. Leider habe ich auch keine genaue Definition über die Arten. Was ich dir anbieten kann ich ein Link zu unserem Skript dort ist es beschrieben aber so wirklich schlau werde ich auch nicht drauß.

https://studip.hochschule-trier.de/send ... iation.pdf

Ich bin seit Tagen damit beschäftigt meine Zusammenfasung zu schreiben aber an dieser Sache bin ich gescheitert und weiß auch nicht mehr weiter.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Den Unterschied zwischen Aggregation und Komposition kann man in Python nicht wirklich erzwingen. Um also zu wissen, was der Dozent da wirklich haben will, müßte man wohl seine Vorlesung durchgehen. Der Link hinter einem Login hilft da nicht.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Link funktioniert fuer uns nicht, da muss man schon eingeschrieben sein. Und ich bezweifele, dass dein Dozent das so geil faende, wenn du den Text hier komplett verfuegbar machst. Kopier mal bitte die relevanten Teile zur Komposition raus.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Okay, das mit dem Skript wird nicht klappen. Ich versuche es in Worte zu fassen und dir die unterschiede zu erläutern.

Komposition : Sonderform der Assoziation. Eine 'ist Teil von-Beziehung. Bsp: Ein Stuhl hat 4 Beine. Entsorgt man den Stuhl, entsorgt man auch die Beine. Wird mit einer gefüllte Raute markiert.

Aggregation: Eine 'hat-Beziehung. Bsp: Vorlesung wird für viele Studierenden gehalten. WIrd die Vorlesung entfernt, hat es keine Auswirkung auf die Studierenden.

SO steht es in unserem SKirpt. Ich weiß nicht wie ich hier eine PDF Datei anhängen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kusja: Okay, ich bin ein bisschen zu spät dran mit folgenem, aber ich wollt's auch nicht wegwerfen. :-)

Man kann nicht so einfach beliebigen Code der Vererbung verwendet so umschreiben das er Komposition verwendet. Jedenfalls nicht sinnvoll. Es hat ja einen Grund warum es diese beiden Konzepte gibt. Vererbung ist eine „ist ein(e)“-Beziehung und Komposition ist eine „hat ein(e)“-Beziehung zwischen zwei Klassen.

Anmerkungen zum Code: Die Kommentare sind fast alle überflüssig. Kommentare sollen den Leser einen Mehrwert liefern. ``# Kindklasse`` vor Klassendefinitionen schreiben die offensichtlich eine Kindklasse sind, weil sie von einer Elternklasse abgeleitet werden, bringt dem Leser nichts. Genau so wenig wie der Hinweis ``#Tiere hinzufügen`` vor Zeilen in denen ganz offensichtlich Tiere zu einem Tierheim hinzufügt werden. Faustregel: Nicht kommentieren *was* der Code macht, denn das steht da bereits als Code, sondern warum er das so macht. Sofern das nicht offensichtlich ist.

Der Kommentar direkt nach der Definition der `Tierheim` gehört zu welchem Code? Kommentare die alleine auf Zeilen stehen, also nicht hinter Code in einer Zeile, beziehen sich auf den Code nach dem Kommentar.

Wenn eine Klasse nicht von einer anderen abgeleitet wird, braucht man auch keine leeren Klammern um die nicht-angegebene Elternklasse zu setzen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Der Klassenname selbst sollte sich in der Regel nicht noch mal in seinen Attributen wiederfinden, denn der Klassename setzt ja bereits den Kontext für den Attributnamen. Bei einem `Tierheim` ist klar das ein Attributname `name` den Namen des Tierheims darstellt, da muss man das Attribut dann nicht `tierheim_name` nennen.

Was soll das Attribut `Tierheim.Tier` bedeuten? Das macht keinen Sinn. Du übergibst da `vogel` beim Erstellen. Warum? Warum ist dieser Vogel am Ende sozusagen zweimal im Tierheim? Einmal als Attribut und einmal in der Liste. Was würde es bedeuten wenn er nur als Attribut aber nicht in der Liste gespeichert wäre?

Grunddatentypen haben nichts in Namen verloren. `liste_tiere` sollte einfach nur `tiere` heissen.

Bei dem Namen `get_Tier()` erwartet der Leser das diese Methode etwas zurückliefert, und so überhaupt nicht das sie das gesamte Tierheim per `print()` ausgibt. Die sollte also beispielsweise `print()` heissen.

``for i in range(len(sequence)):`` nur um dann mit `i` auf die Elemente in `sequence` zuzugreifen ist in Python ein „anti pattern“. Man kann direkt, ohne Umweg über einen Indexzugriff, über die Elemente von Seqzenztypen iterieren.

In der Methode wird auch plötzlich `anzahl_Tiere` an das `Tierheim`-Objekt gebunden. Das gehört da aber gar nicht hin. Das wäre vielleicht ein lokaler Name, wenn es denn nicht gleich darauf nur ein einziges mal in einem `print()` verwendet werden würde. Attribute sollten alle nach abarbeiten der `__init__()`-Methode vorhanden sein, und nicht nachträglich in Methodenaufrufen entstehen.

Der Klassenname beschreibt *ein* Exemplar. Alles was von `Tier` abgeleitet ist, ist also falsch benannt, weil diese Klassen jeweils *ein* Tier beschreiben, also im Singular benannt werden müssen.

Da es nur ein `Tierheim` gibt, macht der Zusatz `_a` in `tierheim_a` keinen Sinn.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3


class Tier:
    def __init__(self, art, name, einlieferungsdatum, id_):
        self.art = art
        self.name = name
        self.einlieferungsdatum = einlieferungsdatum
        self.id = id_


class Tierheim:
    def __init__(self, name):
        self.name = name
        self._tiere = []

    def add(self, tier):
        self._tiere.append(tier)

    def print(self):
        for tier in self._tiere:
            print(tier.name)
        print(len(self._tiere))


class Saeugetier(Tier):
    def __init__(self, saeugerklasse, art, name, einlieferungsdatum, id_):
        super().__init__(art, name, einlieferungsdatum, id_)
        self.saeugerklasse = saeugerklasse


class Vogel(Tier):
    def __init__(
        self,
        ist_flugfaehig,
        schnabelfarbe,
        art,
        name,
        einlieferungsdatum,
        id_,
    ):
        super().__init__(art, name, einlieferungsdatum, id_)
        self.ist_flugfaehig = ist_flugfaehig
        self.schnabelfarbe = schnabelfarbe


class Fisch(Tier):
    def __init__(
        self, lebensraum, fischart, art, name, einlieferungsdatum, id_
    ):
        super().__init__(art, name, einlieferungsdatum, id_)
        self.lebensraum = lebensraum
        self.fischart = fischart


def main():
    affe = Saeugetier(
        "Pflanzentiere", "Säugetier", "Koko", "10.12.2014", 18874
    )
    fisch = Fisch(
        "Süßwasser", "Raubfisch", "Fisch", "Nemo", "20.05.2010", 17896
    )
    vogel = Vogel(True, "blau", "Vogel", "Sky", "02.12.2018", 147896)

    tierheim = Tierheim("AAAA")
    tierheim.add(affe)
    tierheim.add(fisch)
    tierheim.add(vogel)

    tierheim.print()


if __name__ == "__main__":
    main()
Da das Python ist, könnte man aus den `Tierheim`-Objekten etwas machen das eine Länge hat und iterierbar ist. Was die `print()`-Methode noch ein bisschen schlanker werden lässt.

Die `Tier.art` scheint mir Redundant zu sein, weil die ja fest mit der Klasse verbunden zu sein scheint. Im einfachsten Fall kann man da einfach den Klassennamen für hernehmen, oder eine Konstante die auf den `Tier`-Klassen definiert ist, wenn der Tierartname vom Klassennamen abweichen können soll.

Code: Alles auswählen

#!/usr/bin/env python3


class Tier:
    def __init__(self, name, einlieferungsdatum, id_):
        self.name = name
        self.einlieferungsdatum = einlieferungsdatum
        self.id = id_

    @property
    def art(self):
        return self.__class__.__name__


class Tierheim:
    def __init__(self, name):
        self.name = name
        self._tiere = []

    def __len__(self):
        return len(self._tiere)

    def __iter__(self):
        return iter(self._tiere)

    def add(self, tier):
        self._tiere.append(tier)

    def print(self):
        for tier in self:
            print(f"{tier.name} ({tier.art})")
        print(len(self))


class Saeugetier(Tier):
    def __init__(self, saeugerklasse, name, einlieferungsdatum, id_):
        super().__init__(name, einlieferungsdatum, id_)
        self.saeugerklasse = saeugerklasse


class Vogel(Tier):
    def __init__(
        self, ist_flugfaehig, schnabelfarbe, name, einlieferungsdatum, id_
    ):
        super().__init__(name, einlieferungsdatum, id_)
        self.ist_flugfaehig = ist_flugfaehig
        self.schnabelfarbe = schnabelfarbe


class Fisch(Tier):
    def __init__(self, lebensraum, fischart, name, einlieferungsdatum, id_):
        super().__init__(name, einlieferungsdatum, id_)
        self.lebensraum = lebensraum
        self.fischart = fischart


def main():
    affe = Saeugetier("Pflanzentiere", "Koko", "10.12.2014", 18874)
    fisch = Fisch("Süßwasser", "Raubfisch", "Nemo", "20.05.2010", 17896)
    vogel = Vogel(True, "blau", "Sky", "02.12.2018", 147896)

    tierheim = Tierheim("AAAA")
    tierheim.add(affe)
    tierheim.add(fisch)
    tierheim.add(vogel)

    tierheim.print()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na gut, das ist ja am Ende auch nur die Textbuch-Definition. Das einzige, das mir hier moderat sinnvoll einfiele waere, die Tier-Klassen eben NICHT von Tier erben zu lassen. Sondern die als Komposition auszufuehren. Sprich: ein Fisch ist nicht mehr ein Tier, sondern *hat* ein Tier. Fuer das sehr bemuehte Beispiel macht das keinen grossen Sinn, aber das tut das ganze Ding ja nicht. Schreib das also so um.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Code zu Aggregation:
class Employee:
def __init__(self, id, name, Adress):
self.id = id
self.name = name
self.adress = Adress # Objekt wird übergeben
class Adress:
def __init__(self, street, city, state, zipcode):
self.street = street
self.city = city
self.state = state
self.zipcode = zipcode

def print_adress(self):
print(self.street)

address1 = Adress('Musterstraße 12', 'Musterstadt', 'Rlp', '78945')
# Instanz von Adrese muss erstellt werden
E1 = Employee(2,'Hans', address1) # Objekt wird hier übergeben
E1.adress.print_adress()


Code zu Komposition:
class Employee:
def __init__(self, id, name, street, city, state, zipcode):
self.id = id
self.name = name
self.adress = Adress(street, city, state, zipcode)

class Adress:
def __init__(self, street, city, state, zipcode):
self.street = street
self.city = city
self.state = state
self.zipcode = zipcode

def print_adress(self):
print(self.street)

E1 = Employee(2,'Hans','Musteratraße 12','Musterstadt','Rlp', '78945')
E1.adress.print_adress()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python hat jedes Objekt seinen eigenen Lebenszyklus, man kann nicht erzwingen, dass wenn das Tierheim geschlossen wird, auch alle Tiere getötet werden, denn wenn es noch irgendwo einen Verweis auf ein Tier gibt, dann überlebt das.

Die Frage bleibt also, wie denkt Euer Dozent, dass man Komposition in Python umsetzen könnte.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Kusja: ich habe dich schonmal darauf hingewiesen, dass du die Code-Tags benutzen musst. Tu das also bitte.

Und Employee hat eine Adresse. Das koennte man wie ich schon anmerkte eben auch mit den Tierklassen und der Basisklasse Tier so machen. Das ist nicht unbedingt *gut* weil man da ohne mehr zu wissen natuerlicherweise Vererbung nutzen wuerde - aber es erfuellt die Aufgabenstellung.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

@__blackjack__ vielen Dank für deine Antwort. Ich kann leider nur die Dinge sagen und erklären wie unser Dozent es uns erklärt hat. Ich glaube ich habe Python komplett falsch erklärt bekommen, denn viele Sachen die du beschreibst wurden uns nicht beigebracht oder erklärt. Ich bin erst seit 3 Monaten mit Python dran und kann euch leider nicht vieles erklären oder zeigen. Das mit dem __main__ haben wir überhaupt nicht besprochen und wurde uns auch nie gezeigt. Ich bin langsam echt am Ende und bezweifle, dass ich mit meinem aktuellen Stand weiter kommen werde.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

@ __deets__ Tut mir leid... Ich bin gerade echt nicht bei der Sache dabei. Die Klausurenphase hat mich echt komplett ausgelaugt.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du gelesen, was ich sonst noch geschrieben habe? Da es IMHO die einzig sinnvolle Art ist, mit dem gegebenen Code eine Aenderung wie angefragt umzusetzen, solltest du dich daran mal versuchen.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kusja:
WIrd die Vorlesung entfernt, hat es keine Auswirkung auf die Studierenden.
Die Aussage dürfte inhaltlich nicht stimmen. Entweder freuen die sich das sie nun mehr Freizeit haben oder ärgern sich das erreichbare Leistungspunkte wegfallen und sie sich eine andere Vorlesung suchen müssen. ;-)

Das ihr da kein Python beigebracht bekommt kann sein. Je nach dem wie die Vorlesung heisst kann das ja auch Objektorientierung allgemein sein, und die nehmen halt Python, wobei natürlich nicht garantiert ist das irgendeiner der die Aufgaben stellt oder kontrolliert auch tatsächlich Python programmieren kann. Zumal man mit Python auch nicht alles zeigen kann was man so allgemein über Objektorientierung sagen kann. Dazu bräuchte man mehr als eine Programmiersprache, oder eine sehr flexible Sprache mit der man so gut wie alles anstellen kann. Was aus der Lisp/Scheme-Familie beispielsweise, oder Io, oder Tcl. Eben Sprachen in denen man sich Sprachelemente selbst basteln kann.

Das Beispiel mit `Employee` und `Address` ist ziemlich eigenartig. IMHO grenzt das Komposition und Aggregation nicht sinnvoll voneinander ab. Und diese beiden Konzepte *sind*, bzw. ihre Grenze *ist* ziemlich schwammig, weil das nichts technisches ist sondern Semantik. Das kann man so sehen aber auch anders. Insbesondere bei Spielzeugbeispielen, statt realen Anwendungen. Ob das Tierheim und die Tiere nun Aggregation oder Komposition sind, hängt stark davon ab wie das am Ende eingesetzt werden soll. Also ob es sich bei den Tieren um Objekte handelt die tatsächlich stark zu dem Tierheim gehören, also ohne das Tierheim keinen Sinn machen, oder ob man Tierobjekte zum Beispiel zwischen verschiedenen Tierheimobjekten verschieben kann.

@__deets__: Ich würde das dann aber nicht `Tier` nennen, denn ein `Fisch` *hat* ja kein Tier, sondern vielleicht `Grundeigenschaften` oder so ähnlich.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Im Code wurde bisher die Klassifizierung des Tieres zu eng mit dem Individuum verknüpft, also eine extreme Art der Komposition. Was man besser machen könnte, ist die TierArt zu assoziieren:

Code: Alles auswählen

#!/usr/bin/env python3

class TierArt:
    def __init__(self, art):
        self.art = art


class Saeugetier(TierArt):
    def __init__(self, saeugerklasse, art):
        super().__init__(art)
        self.saeugerklasse = saeugerklasse


class Vogel(TierArt):
    def __init__(
        self,
        ist_flugfaehig,
        schnabelfarbe,
        art,
    ):
        super().__init__(art)
        self.ist_flugfaehig = ist_flugfaehig
        self.schnabelfarbe = schnabelfarbe


class Fisch(TierArt):
    def __init__(
        self, lebensraum, fischart, art):
        super().__init__(art)
        self.lebensraum = lebensraum
        self.fischart = fischart


class Tier:
    def __init__(self, art, name, einlieferungsdatum, id_):
        self.art = art
        self.name = name
        self.einlieferungsdatum = einlieferungsdatum
        self.id = id_


class Tierheim:
    def __init__(self, name):
        self.name = name
        self._tiere = []

    def add(self, tier):
        self._tiere.append(tier)

    def print(self):
        for tier in self._tiere:
            print(tier.name)
        print(len(self._tiere))


def main():
    affe = Saeugetier("Pflanzentiere", "Säugetier")
    hecht = Fisch("Süßwasser", "Raubfisch", "Fisch")
    meise = Vogel(True, "blau", "Vogel",

    tierheim = Tierheim("AAAA")
    tierheim.add(Tier(affe, "Koko", "10.12.2014", 18874))
    tierheim.add(Tier(hecht, "Nemo", "20.05.2010", 17896))
    tierheim.add(Tier(meise, "Sky", "02.12.2018", 147896))

    tierheim.print()


if __name__ == "__main__":
    main()
Wie Dein wirklicher Stand in Pythonkenntnissen zu den Erfordernissen Deines Kurses stehen, kann ich nicht beurteilen, vor allem nicht, wenn Du nicht Deinen eigenen Code zeigst. Jeder Dozent hat da seine eigenen Schwerpunkte. Wenn Du die Übungen während des Semesters immer gut bewältigen konntest, stehst Du auch bei der Prüfung nicht schlecht da.
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Mit den anderen Sachen habe ich kaum Probleme, und komme ganz gut zurecht. Könnt Ihr mir evtl paar Ratschläge geben wo ich einfach 'besser' Python erlerne? Ich habe Spaß am progammieren und möchte mehr lernen und meine Fähigkeiten erweitern.

Dieses Forum bietet eigentlich alles was man braucht ich werde mich durch die Tutorien arbeiten und versuche mir einiges selbst beizubringen.

Die Veranstaltung heißt 'Grundlagen der Programmierung mit Python'

Ich bedanke mich herzlich bei allen die so schnell eine Anwort parat hatten. Ihr seid echt Klasse!
Kusja
User
Beiträge: 18
Registriert: Mittwoch 18. Dezember 2019, 20:54

Ich würde euch gerne das Digramm zeigen, nur weiß ich nicht wie ich das hier ins Forum reinkopieren kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kusja: Du kannst das als Bild beispielsweise bei einem Bildhoster wie imgur.com hochladen und dann hier im Forum mit [ img ]-Tags in den Beitrag einbinden.

Beim Veranstaltungsnamen kommt es ein bisschen darauf an wo die Betonung liegt, also ob das „Grundlagen der Programmierung“ halt mit Python ist oder ob es speziell darum geht auch Python zu lernen. Bei letzterem ist der gezeigte Code kein gutes Zeichen, denn wenn man Python lernt oder lehrt sollte man sich, genau wie bei jeder anderen Programmiersprache, an die Konventionen halten. Und „anti pattern“ wie das iterieren über einen Index statt gleich über die Elemente zeugt auch nicht davon das sich da jemand mal mit der Sprache auseinandergesetzt hätte.

Das mit dem Diagramm hört sich nach UML an — da sollte man auch vermitteln das UML bei statisch typisierten Sprachen seine Grenzen hat und eventuell auch wie man damit umgehen kann. Das in Python beispielsweise alles ein Objekt ist, auch Klassen und Module, und das es so etwas wie Funktionen gibt.

@Sirius3: Das fängt IMHO an stark nach javaesquem „over engineering“ zu riechen. Zumal das auch das Problem hat das man im beim erzeugen der Exemplare anfängt die Information die eigentlich durch den Typ schon gegeben ist noch mal als Argument zu wiederholen. Deshalb habe ich ja `art` als Property gelöst das den Klassennamen liefert. Falls man statt "Saeugetier" dann lieber "Säugetier" hätte, kann man das ja in dieser einen Klasse überschreiben. Falls der Klassenname grundsätzlich anders sein sollte als Artname, zum Beispiel weil das eine in Englisch und das andere in Deutsch sein soll, wäre IMHO immer noch eine Konstante auf den Arten die einfachste Lösung ohne anzufangen Typen mit einem Attribut zu erstellen die auch sonst keine Methoden haben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten