Schneller programmieren lernen: Objektorientiertes Programmieren in Python | Alvin Wan | Skillshare
Drawer
Suchen

Playback-Geschwindigkeit


  • 0.5x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 2x

Schneller programmieren lernen: Objektorientiertes Programmieren in Python

teacher avatar Alvin Wan, Research Scientist

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      2:22

    • 2.

      Projekt

      3:03

    • 3.

      Konzept: Grundlagen des OOP

      3:55

    • 4.

      Übung: Eiscreme

      9:54

    • 5.

      (Bonus) Übung: Lichtschalter

      6:10

    • 6.

      (Bonus) Rätsel: Synchronisierte Lichter

      5:13

    • 7.

      Konzept: Abstraktion

      5:03

    • 8.

      Übung: Eiscremewagen

      7:57

    • 9.

      (Bonus) Übung: Synchronisierte Lichter

      6:35

    • 10.

      Konzept: Vererbung:

      4:17

    • 11.

      Übung: Deluxe-Eiscremewagen

      4:37

    • 12.

      (Bonus) Übung: Flackernde Lichter

      4:07

    • 13.

      (Bonus) Rätsel: MRO

      3:20

    • 14.

      Konzept: Mehr zur Vererbung

      5:36

    • 15.

      Übung: Schmelzende Eiscreme

      5:20

    • 16.

      (Bonus) Übung: Zeitgesteuerte Lichter

      5:40

    • 17.

      (Bonus) Rätsel: Fragile Base Class-Problem

      3:01

    • 18.

      Schlussbemerkung

      2:55

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

6.969

Teilnehmer:innen

22

Projekte

Über diesen Kurs

Hast du schon einmal den Begriff „objektorientierte Programmierung“ gehört? Ist er dir völlig neu, aber du möchtest deine Programmierkenntnisse verbessern?

Dieser Kurs behandelt ein wichtiges Thema für alle Programmierer:innen: die objektorientierte Programmierung (OOP). Wir behandeln mehrere Konzepte und Themen:

  • Das Paradigma der objektorientierten Programmierung
  • Einfacher Eiswagen-Simulator mit OOP-Konzepten
  • Minimale Simulation für Lichtschalter in einem Zuhause mit OOP-Konzepten
  • Klassen und Instanzen
  • Deine erste Klasse schreiben
  • Code lesbar (Abstraktion), wartbar (Vererbung) und flexibel halten (Mixins, Komposition)
  • 1 Stunde Inhalt mit kurzen 5-minütigen Lektionen und 30 Minuten Bonusinhalten

Der Kurs ist sehr interaktiv, denn wir werden zusammen programmieren. Am Ende des Kurses kannst du Code mit objektorientierter Programmierung schreiben und lesen können. Noch wichtiger: Du wirst ein neues Tool für die Organisation deines Codes erlernt haben.

Bist du interessiert am kreativen Programmieren? Wirf einen Blick auf meinen Kurs VR101 (AFrame).

Interessierst du dich für Datenwissenschaft oder maschinelles Lernen? Dann sieh dir meine anderen Kurse an: Programmieren 101 (Python), SQL 101 (Datenbankdesign) Data 101 (Analytics), oder Computer Vision 101 (Angewandtes ML).

Danksagung: Im Einführungsvideo verwendete B-Rolls von Kreator:innen auf Pexels (Anthony Shkraba, Mikhail Nilov, Mart Production, Karolina Grabowska, Vitaly Vlasov, pixabay, pressmaster, Andy Barbour, pavel danilyuk, Roman Odintsov, German Korb, cottonbro)

Triff deine:n Kursleiter:in

Teacher Profile Image

Alvin Wan

Research Scientist

Top Teacher

Hi, I'm Alvin. I was formerly a computer science lecturer at UC Berkeley, where I served on various course staffs for 5 years. I'm now a research scientist at a large tech company, working on cutting edge AI. I've got courses to get you started -- not just to teach the basics, but also to get you excited to learn more. For more, see my Guide to Coding or YouTube.

Welcoming Guest Teacher Derek! I was formerly an instructor for the largest computer science course at UC Berkeley, where I taught for several years and won the Distinguished GSI (graduate student instructor) award. I am now a software engineer working on experimentation platforms at a large tech company. 4.45 / 5.00 average rating (943 reviews) at UC Berkeley. For more, see my Skillshare or Webs... Vollständiges Profil ansehen

Level: Intermediate

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: Ich wünschte, ich hätte dieses Geheimnis schon vor langer Zeit gewusst. Ich sage Ihnen jetzt, es gibt zwei Möglichkeiten, als Coder zu wachsen. Erstens, Sie können Jahre dauern, um 100 Fehler für jedes einzelne Codierprinzip, das Sie anwenden, zu üben . Zweitens, Sie können Tage dauern, sogar Stunden, die gleichen Prinzipien von einem anderen Coder lernen. Hier ist der Kicker. Eines der wichtigsten Dinge, die ein Senior Coder Ihnen beibringen kann , ist Möglichkeiten, über Code nachzudenken. Eine dieser Möglichkeiten ist objektorientierte Programmierung, oder kurz OOP, die geheime Sauce, um Ihren Code auf die nächste Ebene zu bringen. Hi, ich bin Alvin. An der UC Berkeley habe ich über 5.000 Studenten unterrichtet. Vom Unterricht in diskreter Mathematik bis hin zum maschinellen Lernen. Ich werde Ihnen Weisheit geben, die mir Professoren, leitende Ingenieure und Mentoren gegeben haben, damit Sie schneller als Coder wachsen können, als ich es je getan habe. In dieser Klasse lernen Sie, wie Sie kritisch als Programmierer denken. Dieses kritische Denken ermöglicht es Ihnen, die Welt um Sie herum als eine Reihe verschiedener Objekte zu modellieren , die miteinander interagieren. Dieses kritische Denken ermöglicht es Ihnen auch, lesbaren, wartbaren und flexiblen Code zu bewerten . OOP wird überall verwendet, für Spiele, für maschinelles Lernen, für Data Science. Am Ende dieses Kurses werden Sie verstehen, warum und wie. Sie werden in der Lage sein, im Code einen Fahrrad-Shop zu imitieren, der Reparaturen verarbeitet, einen Eiswagen, der Aufträge verwaltet, oder einen Fluglotsen, der Flugzeuge lenkt. Diese Codierung 101 plus Klasse ist für Anfänger geschrieben, die entweder an einem interessiert sind, nivellieren ihren Code oder zwei, frustriert versuchen, objektorientierte Programmierung zu lernen. Wenn du das bist, mach dir keine Sorgen. Ich hatte in der Vergangenheit einen fairen Anteil an Verwirrung und hoffe, Ihnen jetzt bei Ihrer Verwirrung helfen zu können. Beachten Sie, dass diese Klasse eine gewisse Codierungsvertrautheit mit Python erwartet. Wenn Sie noch nicht vertraut sind, stellen Sie sicher, dass Sie meinen Coding 101: Python for Beginners Kurs nehmen, um sich zu verfangen. Ihre Takeaways von dieser Klasse werden keine seltsame Syntax oder bestimmte Python Regeln sein. Stattdessen ist es eine Art zu denken. Sie brauchen nur die Intuition, um diese Konzepte anzuwenden, auch wenn Sie vergessen, wie die Konzepte genannt werden. Zusätzlich zu diesen Konzepten hoffe ich, Ihnen dabei zu helfen, Vertrauen zu bauen; Vertrauen Lesen, Schreiben, Sprechen über OOP-Konzepte. Beginnen wir nun mit dem Bauen mit Objektorientierter Programmierung. 2. Projekt: In dieser Klasse besteht Ihr Projekt darin, eine Simulation mit den von Ihnen erlernten Konzepten zu erstellen. Als Beispiel werden Sie einen Eiswagen bauen, der Aufträge und ein minimales Modell von Lichtschaltern in einem Haus verwaltet . Ihre Simulation könnte für alles sein. Ein Fahrradladen, der Reparaturen verarbeitet, ein Lager, das Massensendungen verarbeitet, oder ein Fluglotsen, der Flugzeuge verwaltet. Wählen Sie das Szenario, das Sie wollen. Stellen Sie einfach sicher, dass Ihr Szenario viele verschiedene Arten von interagierenden Objekten aufweist. Die Simulation, die Sie erstellen, ist leistungsstark. In Zukunft können Sie eine Schnittstelle hinzufügen, um es zu einer Management-App zu machen, dieses System verwenden, um die Zukunft für ein sehr komplexes System vorherzusagen oder ein Spiel damit zu erstellen. In dieser Klasse werden wir nicht die Schnickschnack abdecken, zum Beispiel, wie man eine Schnittstelle hinzufügt. Stattdessen konzentrieren wir uns auf den Kern, eine interagierende Reihe von Objekten und wie dieser Code flexibel, skalierbar und wartbar gemacht werden kann. Dies ist eine großartige Möglichkeit, die Macht der objektorientierten Programmierung zu verstehen und wie sie effektiv zu nutzen ist. Wie Sie vielleicht von einer meiner vorherigen Klassen gehört haben, ist mein Motto, Ihnen die Aufregung zu geben, mehr zu lernen, nicht unbedingt eine Wäscheliste mit verschiedenen Python Dienstprogrammen zu geben. Dasselbe gilt in dieser Klasse. Aber hier möchte ich Ihnen auch die Intuition geben, um besseren, saubereren Code zu schreiben. Um das zu tun, werden wir jedes Konzept codieren, nicht einmal, sondern zweimal. Wir werden dies speziell in vier verschiedenen Phasen tun. Zunächst werden wir das OOP-Paradigma, die Philosophie und die Grundlagen der objektorientierten Programmierung behandeln . Zweitens, Vererbung, Möglichkeiten, OOP weniger redundant zu machen und die Verständlichkeit zu verbessern. Schließlich, Mixins und Komposition, Möglichkeiten, OOP leicht erweiterbar und flexibel zu machen. Während wir jedes dieser Konzepte praktizieren, möchte ich, dass Sie ein Gefühl dafür bekommen, was falsch ist und was richtig ist, wenn Sie Code entwerfen. Das Vergessen dieser genauen Begriffe und Definitionen macht keinen großen Unterschied, was Sie wollen, ist die Intuition, saubereren, besseren Code zu schreiben. Jede der vier Phasen ist in drei verschiedene Teile aufgeteilt. Der erste Teil ist das Konzept, die Ideen, Begriffe und Definitionen einführt. Die zweite ist die Praxis. Sie werden diese Konzepte dann in zwei verschiedenen Beispielen verwenden. Einige Phasen werden von einer geheimnisvollen Lektion begleitet werden. Diese Mystery Lektion behandelt ein spezielles OOP Konzept. Diese Geheimnisse sind echte Bugs, auf die Schüler schon einmal begegnet sind. Ich hoffe, dass diese Lektionen Ihnen in Zukunft etwas Schmerz und Verwirrung ersparen können. Möglicherweise haben Sie von anderen OOP-Konzepten wie Polymorphismus oder Kapselung gehört. Ich habe diese Begriffe kurz, aber nicht im Detail erwähnt, da ich glaube, dass der Kern von OOP mit den Begriffen liegt, die wir abdecken werden, Abstraktion, Vererbung, Mixins und Komposition. Es gibt eine große Anzahl von Unterrichtsstunden, aber ich habe jede Lektion so konzipiert , dass Sie hoffentlich jeden dieser Lektionen unterwegs, auf dem Pendeln, in der Badezimmerpause, jederzeit wirklich nehmen können. Ich hoffe, Sie sind aufgeregt, Ihre Simulation zu erstellen. Lasst uns loslegen. 3. Konzept: Grundlagen des OOP: In dieser Lektion werde ich das objektorientierte Programmierparadigma vorstellen. Es wird keinen Code in dieser Lektion geben. Das Ziel ist es einfach, die OOP Denkweise einzuführen. In dieser Lektion werden drei Konzepte behandelt. Das erste Konzept ist der Unterschied zwischen einer Klasse und einer Instanz. Hier haben wir eine Schablone Eis. Später werden wir darüber sprechen, was diese Vorlage tatsächlich enthält. Für jetzt, denken Sie an diese Vorlage als Ihre Erwartung eines Eiss. Sie erwarten, dass Sie es essen können, erwarten Sie eine Kugel Eis und einen Eiskegel, und vielleicht erwarten Sie standardmäßig Vanillegeschmack. Jedoch, diese Vorlage, Ihre Erwartung ist imaginär. Hier haben wir eine echte Eiscreme servieren, die Sie essen können. Beachten Sie, dass Sie mehrere Portionen aus einer einzigen Vorlage erzeugen können. Beachten Sie auch, dass Sie jede Portion zu unterschiedlichen Preisen essen können. Eine Portion kann eine Schaufel übrig haben und die andere darf keine Schaufel mehr haben. Nun lassen Sie uns die Vorlage umbenennen und servieren. Anstelle von Vorlage nennen wir dies eine Klasse. Die Eisklasse ist Ihre Erwartung eines Eiss, was es enthält und wie Sie damit interagieren können. Wir werden dies im nächsten Abschnitt genauer sezieren. Anstatt zu dienen, rufen wir diese Instanzen an. Eine Eisinstanz ist ein tatsächliches Eis, das Sie essen können. Wie zuvor, beachten Sie, dass Sie mehrere Instanzen aus einer einzelnen Klasse erzeugen können. Sie können auch jede Instanz mit einer anderen Rate essen. Eine Instanz kann eine Schaufel übrig haben, und die andere hat möglicherweise keine Schaufeln mehr. In der OOP-Terminologie sagen wir, dass wir die Eisklasse definiert haben. In dieser Lektion gebe ich Ihnen einige grundlegende Bausteine für das Entwerfen dieser Klassen. Wir beginnen mit der Definition von Methoden. In diesem Abschnitt werden wir über Klassenmethoden sprechen. Wir verwenden tatsächlich Methoden in Coding 101 Python für Anfänger, aber in dieser Klasse werden wir Methoden definieren. Um die Methode zu verstehen, gehen wir zurück zu unserem Eis-Beispiel. Methoden helfen uns zu definieren, was ich mit Eis machen kann. Nun, wir können essen und unserem Eis Schaufeln hinzufügen, und das war's. Diese beiden Aktionen sind unsere Methoden. Wir werden diese Methoden später codieren. In der OOP Terminologie entwerfen wir unsere Eis-Klasse, um die Eat and Add Scoop Methoden einzubeziehen. Auch hier entwerfen wir unsere Eis-Klasse, um die Eat and Add Scoop Methoden einzubeziehen. Das schließt die Methoden ab. Aber jetzt, wie implementieren wir diese Methoden? Nun, jede unserer Eiscreme-Instanzen muss wissen, wie viele Kugeln noch übrig sind. Das bringt uns zu Attributen. Attribute sind Teile von Informationen. Wir konzentrieren uns zunächst auf Informationen, die spezifisch für eine Instanz oder eine Portion Eis sind. Zurück zu unserem Eis-Beispiel, welche Informationen sind spezifisch für jede Eisinstanz? Erstens kann die Anzahl der verbleibenden Schaufeln zwischen Eiscreme-Instanzen unterschiedlich sein. Zweitens kann der Geschmack von Eis zwischen Eiscreme-Instanzen unterscheiden. In der OOP Terminologie entwerfen wir unsere Eis-Klasse, um die Eat and Add Scoop Methoden einzubeziehen. Es enthält auch Attribute für die Anzahl der verbleibenden Kugeln und den Eisgeschmack, und das war's. Dies sind die Bausteine der objektorientierten Programmierung. Um zusammenzufassen, haben wir den Unterschied zwischen Klassen oder Vorlagen und Instanzen behandelt. Wir haben auch die Regel der Methoden diskutiert, die beschreiben, wie man mit einer Instanz interagiert. Wir erwähnten Attribute, die Informationen über eine Instanz enthalten. Ich weiß, dass es viele Begriffe in dieser Lektion gab, aber keine Sorge, wir werden diese Begriffe in den kommenden Lektionen immer wieder verwenden. Am Ende dieser Klasse haben Sie es satt, die Wörter Klasse, Instanz, Methode und Attribut zu hören . Aber Sie werden diese Begriffe auch viel tiefer verstehen. Eine Kopie dieser Folien und weitere Ressourcen finden Sie auf der Kurs-Website. Damit ist unsere Lektion, das objektorientierte Programmierparadigma, abgeschlossen. In der nächsten Lektion beginnen wir, einen Eiswagen mit diesen Konzepten zu simulieren. 4. Übung: Eiscreme: In dieser Lektion schreiben wir unser allererstes Stück Code mit objektorientierter Programmierung. Navigieren Sie zunächst zu repl.it/languages/python3. Ich schlage vor, das Video hier zu pausieren und ein Konto zu erstellen, wenn Sie es noch nicht getan haben. Während Sie ohne Konto codieren können, können Sie mit einem Konto Ihren Code speichern. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Auf diese Weise kannst du mit mir kodieren. Der erste Schritt ist die Definition Ihrer ersten Klasse. Hier ist, wie. Ein beliebiges Zeichen in Schwarz ist erforderlich. Es muss genau so getippt werden. Wir beginnen mit dem Schlüsselwort class in schwarz, dann fügen wir den Klassennamen in blau bezeichnet hinzu. Wie viele andere Python Konzepte, die Sie gelernt haben, fügen Sie einen Doppelpunkt hinzu, fügen Sie dann zwei Leerzeichen hinzu und verwenden Sie vorerst den Pass. Pass ist nur ein Platzhalter für anderen Code, den wir später schreiben werden. Lassen Sie uns das jetzt programmieren. In dieser Lektion erstellen wir einen Eiskurs. Lassen Sie uns das Format verwenden, das wir auf der linken Seite sehen, geben Sie in Klasse, IceCream. Schlag den Doppelpunkt. Sobald Sie Enter eingegeben haben, wird Repl.it automatisch zwei Leerzeichen für Sie erstellen. Geben Sie nun den Durchlauf ein. Ich werde Escape treffen, um dieses Modal zu entlassen. Das war's für deine allererste Klasse. Lassen Sie uns diese Klasse jetzt verwenden, um eine Instanz zu erstellen. Wir nennen diesen Prozess der Erstellung einer Instanz aus einer Klasseninstanziierung. Hier ist, wie Sie instanziieren. Instanziierung ist wirklich nur die rechte Hälfte dieses Formats, geben Sie den Klassennamen in blau ein, fügen Sie dann zwei Klammern hinzu, und das ist alles, was Sie brauchen, um zu instanziieren. Wir weisen diese Instanz auf der rechten Seite auch einer Variablen auf der linken Seite zu. Genau wie bei der Definition einer anderen Variablen haben wir den Variablennamen in rosa auf der linken Seite, ein schwarzes Gleichheitszeichen mit optionalen Leerzeichen und dann den Wert. In diesem Fall ist der Wert die Instanz. Lassen Sie uns das jetzt programmieren. Bevor Sie beginnen, stellen Sie sicher, dass Sie Ihre Datei ausführen, indem Sie auf „Ausführen“ klicken, den grünen Pfeil oben. Als nächstes verwenden wir die interaktive Eingabeaufforderung, um unseren Code zu testen. Ihre interaktive Eingabeaufforderung befindet sich möglicherweise auf der rechten Seite des Bildschirms. Ich habe das Layout so geändert, dass meins auf der Unterseite ist. Geben Sie zunächst den Variablennamen ein, und geben Sie dann den Klassennamen und die Klammern ein. Lassen Sie uns nun sehen, was das variable Eis enthält und das enthält unsere Instanz oder unser Objekt. Das nächste Konzept ist eine Methode. Wir fügen unserer Klasse nun eine Aktion oder ein Verhalten hinzu. Das ist es, was wir bisher haben. Um eine Methode hinzuzufügen, definieren wir einfach eine Funktion innerhalb der Klasse. Dies sollte vertraut aussehen, das Schlüsselwort def, das wir zuvor gesehen haben. Wir verwenden def auch, um Funktionen zu definieren. Der einzige Unterschied besteht darin, dass unser erstes Argument die Methode hier selbst in Schwarz bezeichnet werden muss. Hier haben wir den Methodennamen in blau, die Methodeninhalte in orange und Leerzeichen in grau. Lassen Sie uns das jetzt programmieren. Innerhalb Ihres Editors werden wir jetzt diesen Pass löschen und die Eat-Methode hinzufügen, also def selbst Doppelpunkt essen, genau wie wir auf der linken Seite sehen. Jetzt werden wir drucken, und ich werde Yum schreiben. Das ist es, um Ihre Eat-Methode zu definieren. Lassen Sie uns nun diese Methode testen oder verwenden. Um diese Methode zu testen oder zu verwenden, verwenden Sie die im Kurs „Python für Anfänger“ wiederhergestellten Punktausdrücke, geben Sie den Instanzvariablennamen ein , der in unserem Beispiel ice ist, fügen Sie einen schwarzen Punkt hinzu, fügen Sie dann die -Methodenname in blau. Schließlich verwenden Sie zwei Klammern, um die Methode genau so aufzurufen, wie wir Funktionen aufrufen. Lassen Sie uns das jetzt programmieren. Vergessen Sie auch nicht, die Datei auszuführen, indem Sie auf den grünen Pfeil klicken. Zuerst instanziieren, also IceCream gleich IceCream mit Klammern. Rufen Sie dann die Eat-Methode auf. Wir verwenden die Vorlage auf der linken Seite, ice_cream, unsere Variable name.eat. Drücken Sie Enter und wir erhalten Yum, das ist unsere Print-Anweisung im Körper der Eat-Methode. Jetzt stellen wir ein Konzept namens Konstruktor ein. Der Code im Konstruktor wird ausgeführt, wenn die Klasse instanziiert wird. Lassen Sie mich Ihnen mit gutem Beispiel zeigen. Hier ist ein Beispielkonstruktor. Beachten Sie, dass die erste Zeile komplett schwarz ist. Sie müssen das genau für den Moment kopieren. Wie immer können Sie den gewünschten Code in Orange im Körper der Methode platzieren. Hier druckt unser Konstruktor einfach hoch. Lassen Sie uns das jetzt programmieren. Wir werden einen Konstruktor zu unserer Eis-Klasse hinzufügen. Hier haben wir def_init_self Doppelpunkt, genau wie wir auf der linken Seite sehen, und dann werden wir etwas unvergessliches drucken. In diesem Fall werden wir sagen, drucken Erstellt Eis. Ich werde hier eine Blinzzeile hinzufügen, nur um unseren Code sauber und lesbar zu halten. Führen Sie die Datei erneut aus, indem Sie den grünen Pfeil drücken. Wir werden jetzt unsere Eis-Klasse instanziieren, Eiscreme entspricht IceCream und hier können Sie Kreiert Eis sehen. Nun, für unser endgültiges Konzept, ein Attribut. Zuweisen eines Attributs ist dem Definieren einer Variablen sehr ähnlich. Hier haben wir den Attributnamen in rosa und den Wert in orange. Beachten Sie jedoch, dass wir das Selbst haben. in schwarz. Das ist wichtig. Dies ist, wie wir das Attribut an die aktuelle Eisinstanz anhängen. Self wird immer auf die aktuelle Instanz verweisen. Lassen Sie uns das jetzt programmieren. Löschen Sie den Inhalt eines Konstruktors. Stattdessen werden wir self.scoops gleich 3 hinzufügen. Dadurch wird die Anzahl der Schaufeln drei zugewiesen. Lassen Sie uns das testen. Führen Sie Ihre Datei aus, indem Sie auf den grünen Pfeil ganz oben klicken. Dann instanziieren Sie Ihren Eiskurs. Überprüfen Sie die Anzahl der Messlöffel. Hier haben wir die instance.scoops. Hier haben wir drei wie erwartet. Das war nicht der letzte Teil der Lektion. Wir haben tatsächlich zwei weitere Codeausschnitte zu überprüfen. Lassen Sie uns unsere Essensmethode ändern, um die Anzahl der gegessen Schaufeln zu berücksichtigen. Dies war unsere vorherige Methodendefinition mit dem Methodennamen in blau und dem Methodeninhalt in orange. Nun fügen wir ein Argument in grün hinzu. Wir können dann dieses grüne Eingabeargument verwenden, in diesem Fall y in unserer Methode. Hier verwenden wir y, um y mal y zu berechnen. Wir haben auch den Methodennamen in blau, den Methodeninhalt in orange und Leerzeichen. Lassen Sie uns das jetzt programmieren. In unserer Eat-Methode fügen wir ein Eingabeargument namens scoops hinzu. Dies ermöglicht es dem Eisbenutzer, wie viele Schaufeln sie gleichzeitig mögen zu essen. Jetzt aktualisieren wir die Anzahl der Messlöffel, die das Eis übrig hat. Anstelle von Druck Yum, fügen Sie selbst.scoops gleich der ursprünglichen Summe, aber minus der Anzahl der Messlöffel, die wir essen möchten. Ich werde auch eine andere Art vorstellen, diese Codezeile zu schreiben, die viel kürzer ist. Wir können dies auch durch self.scoops minus gleich Schaufeln ersetzen. Diese beiden Zeilen sind genau gleich, also werde ich die erste hier löschen. Diese Linie sagt, verringern Sie die Anzahl der Schaufeln um die Anzahl der Kugeln, die wir essen möchten. Lassen Sie uns überprüfen, wie man eine Methode aufruft. Von links nach rechts haben wir den Instanzvariablennamen in rosa, einen Punkt und den Methodennamen in blau dann das Eingabeargument in grün. Versuchen wir es jetzt. Gehen Sie weiter und klicken Sie auf die grüne Schaltfläche ganz oben, um Ihre Datei auszuführen. Geben Sie dann Eiscreme gleich IceCream ein. Das instanziiert. Dann werden wir überprüfen, wie viele Schaufeln derzeit enthalten sind, die drei sind. Dann werden wir essen oder nennen die Eat-Methode mit dem Argument zwei, wie wir auf der linken Seite sehen. Dies wird zwei Messlöffel essen, und lassen Sie uns überprüfen, wie viele Messlöffel übrig sind. Wir haben eine Kugel wie erwartet. Damit sind unsere Grundlagen für das Schreiben von objektorientiertem Programmiercode abgeschlossen. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Du denkst vielleicht: „Heilige Kuh, es gibt viele neue Begriffe. Das ist ziemlich überwältigend.“ Wenn du das bist, mach dir keine Sorgen. Irgendwann war ich auch dort. Zögern Sie nicht, zur nächsten Lektion zu springen, die Praxis ist, weiterhin Vertrautheit mit diesen OOP-Begriffen aufzubauen. Alternativ können Sie die Lektion fortsetzen, wenn Sie an einigen herausfordernden Bonusübungsproblemen interessiert sind . Nun, weiter zu unserer Bonus-Sektion Praxis. Lassen Sie uns üben, die Terminologie in dieser Lektion zu verwenden, indem Sie zwei weitere Codeausschnitte hinzufügen. Erstens, um zu überprüfen, nimmt diese Eat-Methode in einem Schaufelargument und subtrahiert, dass viele Messlöffel von der Gesamtzahl der Messlöffel. Nun, um zu üben, erstellen Sie eine Methode namens add, die ein scoops-Argument übernimmt und fügt, dass viele Scoops zur Summe hinzu. Halten Sie das Video hier an und versuchen Sie es jetzt. Wenn du nicht weißt, wo du anfangen sollst, ist das okay. Du bekommst das mit mehr Wiederholung. Lassen Sie uns nun die Methode schreiben, fügen Sie hinzu. Direkt unter unserer jede Methode, werden wir hinzufügen definieren. Auch hier ist das erste Argument immer selbst. Fügen Sie dann das Argument scoops hinzu. Wir sollten dann die Anzahl der Messlöffel zur Summe hinzufügen. Dies schließt unsere Add-Methode ab. Lasst uns noch einen üben. Dies wird Ihr Wissen aus der Python Codierung 101-Klasse testen. Zeit zu überprüfen, ob Aussagen, wenn Sie sie vergessen haben. bei der Eat-Methode, Überprüfen Siebei der Eat-Methode,ob die Anzahl der verbleibenden Messlöffel kleiner ist als die Anzahl der Messlöffel, die der Benutzer zu essen versucht. Wenn ja, drucken Sie nicht genügend Bytes übrig. Falls nicht, ziehen Sie die Anzahl der Scoops wie gewohnt von der Summe ab. Halten Sie das Video erneut hier an, um es zu versuchen. Wenn du nicht weißt, wie das geht, mach dir keine Sorgen. Mit mehr Praxis wird mehr Vertrautheit kommen. Nun, lasst uns unsere Ess-Methode erweitern. Wir werden überprüfen, ob die Anzahl der Schaufeln kleiner ist als die Anzahl der Schaufeln, die der Benutzer zu essen versucht. Wenn ja, drucken Sie nicht genügend Bytes übrig. Andernfalls eine Anzahl von Messlöffel insgesamt wie gewohnt abziehen. Das schließt unsere Augmented-Eat-Methode ab. Das war's für diese Lektion. Auch in der nächsten Lektion werden wir einige Übung haben, um weiterhin Vertrautheit mit diesen OOP-Begriffen aufzubauen. 5. (Bonus) Übung: Lichtschalter: Willkommen bei Bonuspraxis. In dieser Lektion erstellen wir eine Simulation für eine Reihe von Lichtquellen. Navigieren Sie wie zuvor zu repl.it/languages/python3. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Zunächst einmal ist, wie Sie Ihre Klasse definieren sollten. Wir haben die Klasse Schlüsselwort in schwarz, Klassenname in blau, Doppelpunkt, zwei Leerzeichen und den Körper der Klasse in orange, das ist der Pass Platzhalter für jetzt. Lassen Sie uns das programmieren. In dieser Lektion simulieren wir einen Lichtschalter. Also nennen wir unsere Klasse Licht. Klasse Licht: „Enter“, die zwei Räume für uns schaffen und gehen Sie voran und geben Sie „Pass“. Lassen Sie uns nun eine Instanz unserer Klasse erstellen oder unsere Klasse instanziieren. Auf der rechten Seite haben wir den Klassennamen in blau und Klammern in schwarz. Das ist alles, was wir brauchen, um die Klasse zu instanziieren. Allerdings sollten wir diese Instanz einer Variablen zuweisen. Wir haben den Variablennamen in rosa, Gleichheitszeichen in schwarz mit optionalen Leerzeichen und den Klassennamen in blau. Lassen Sie uns das jetzt programmieren. Gehen Sie weiter und drücken Sie den grünen Pfeil ganz oben, um Ihren Code auszuführen. Wieder werden wir jetzt unseren Dolmetscher eingeben. Für Sie ist Ihr Dolmetscher möglicherweise auf der rechten Seite Ihres Bildschirms, meins befindet sich in der unteren Hälfte. Wir werden jetzt die Variable definieren, die Licht ist, und den Klassennamen mit Klammern zu instanziieren. Lassen Sie uns sehen, was die Lichtvariable enthält und sie enthält eine Instanz oder ein Objekt. Fügen wir nun die Möglichkeit hinzu, das Licht ein- und auszuschalten. Hier ist die Klasse in unserem Beispiel, und hier ist die Methode add. Wir haben das Schlüsselwort def in schwarz, Methodenname in blau und der Körper der Methode in orange, zusammen mit den Leerzeichen in grau. Wir werden jetzt eine Methode umschalten mit diesem Format definieren. Ersetzen Sie das Pass-Schlüsselwort und geben Sie stattdessen def toggle erneut mit dem Argument self ein und drucken Sie „Toggle on and off!“. Ich werde „Escape“ drücken, um dieses Modell zu entlassen. Jetzt sollten wir sehen, wie man dieses Programm testen kann. Dies sind die Punktausdrücke, die Sie zuvor gesehen haben. Wir haben den Instanzvariablennamen in rosa, einen Punkt in schwarz, den Methodennamen in blau und die Klammern wieder in schwarz. Diese Klammern werden benötigt, um die Methode zu codieren. Lassen Sie uns jetzt dieses Programm testen. Führen Sie zuerst den Code aus, indem Sie auf den grünen Pfeil ganz oben klicken. Instanziieren Sie Ihr Licht, dann rufen Sie die Toggle-Methode, light.toggle und hier erhalten wir unsere print-Anweisung. In diesem nächsten Abschnitt werden wir den Konstruktor abdecken. Hier ist ein Beispiel für Konstruktor mit der ersten Zeile vollständig in schwarz und der Körper des Konstruktors in orange. Wir haben hier den Ausdruck und die Räume in Grau. Fügen wir nun einen Konstruktor hinzu. Wir werden init mit dem Selbst-Argument definieren und dann werden wir „Creating light“ drucken. Wie zuvor werde ich einen Platz für die Lesbarkeit hinzufügen. Führen Sie Ihren Code erneut aus, indem Sie auf den grünen Pfeil ganz oben und „Licht gleich Licht“ eingeben, um zu instanziieren. Hier bekommen wir die Druckaussage, die wir zuvor geschrieben haben. Wir werden jetzt Attribute hinzufügen, um den internen Zustand des Lichts zu verfolgen, unabhängig davon, ob es ein- oder ausgeschaltet ist. Dies ist das Format zum Definieren von Attributen. Wir haben einen Selbstpunkt in schwarz, der Attributname in rosa und der Wert in orange. Self bezieht sich immer auf die aktuelle Instanz. Lassen Sie uns das jetzt programmieren. Zuerst setzen wir im Konstruktor On auf False. Dann innerhalb der Toggle-Methode werden wir überprüfen, ob das Licht derzeit eingeschaltet ist. Also, wenn self.on: dann setzen wir das Licht auf False und wenn es derzeit nicht eingeschaltet ist, dann schalten wir es ein. Wir können diese vier Codezeilen tatsächlich schnell mit nur einer Codezeile zusammenfassen , indem wir self.on gleich nicht self.on eingeben. Wenn self.on wahr ist, wird uns nicht wahr geben falsch. Wenn self.on wahr ist, wird uns nicht wahr geben falsch. So erlaubt es uns nicht, einfach zwischen wahr und falsch zu wechseln. Auch hier ist diese Zeile genau die gleiche wie diese vier Zeilen. Ich werde diese ersten vier Zeilen löschen und das ist unsere Toggle-Methode. Lassen Sie uns jetzt unseren Code testen. Drücken Sie erneut den grünen Pfeil, um Ihren Code auszuführen, und wir werden unser Licht instanziieren. Wir werden prüfen, ob es eingeschaltet ist oder nicht. Es ist momentan nicht eingeschaltet. Lassen Sie uns das Licht umschalten und überprüfen, ob es wieder eingeschaltet ist und es tatsächlich eingeschaltet ist. Unser Code funktioniert. Vergewissern Sie sich, dass Sie eine Kopie dieser Folien und den fertigen Code für diese Lektion erhalten, dass Sie sich die Kurs-Website ansehen. Das schließt unsere Übungslektion ab. Ich hoffe, Sie fühlen sich irgendwie vertraut mit der Terminologie bis jetzt. Es gibt keine Notwendigkeit, sich die Formate zu merken, die wir behandelt haben. Zuerst kannst du es immer nachschlagen. Zweitens: Wenn Sie diese Formate immer wieder sehen, werden Sie am Ende dieses Kurses besser mit ihnen vertraut sein als jetzt. In der nächsten Lektion besuchen wir einen mysteriösen Fehler und wie man ihn repariert. Wenn Sie mit schwierigeren Problemen üben möchten, schauen Sie sich diese Lektion für eine Übung an. Wie in der letzten Lektion haben wir jetzt eine Bonuspraxis. Erstellen Sie eine Methode namens is_on, die zurückgibt, ob das Licht eingeschaltet ist oder nicht. Pausieren Sie das Video und versuchen Sie es jetzt, und hier ist die Lösung. Wir werden eine weitere Methode innerhalb der Light-Klasse namens is_on hinzufügen. Wieder brauchen Sie Ihr Selbstargument, und wir werden einfach soft.on zurückgeben. Ich werde „Escape“ drücken, um dieses Modell zu entlassen und gehen Sie voran und führen Sie Ihren Code durch Klicken auf den grünen Pfeil. Ich werde das Licht instanziieren und hier werden wir überprüfen, ist das Licht an, indem Sie light.is_on eingeben. Stellen Sie sicher, dass Sie Ihre Methode mit Klammern codieren und tatsächlich ist es falsch. Nun, schalten wir das Licht so, dass es eingeschaltet ist und überprüfen, ist es an? In der Tat, das ist wahr. Unsere Methode funktioniert. Wie wir bereits gesagt haben, schließt dies unsere Lektion ab und in der nächsten Lektion werden wir einen mysteriösen Fehler besuchen und wie man ihn beheben kann. 6. (Bonus) Rätsel: Synchronisierte Lichter: In dieser Lektion werden wir einen mysteriösen Fehler behandeln und wie man ihn beheben kann. Beachten Sie, dass diese Geheimnisse einige der verwirrendsten Teile von OOP behandeln. Wenn Sie sich überwältigt fühlen, schlage ich vor, diese geheimnisvollen Abschnitte auf dem ersten Durchgang zu überspringen sie auf einem zweiten Durchgang zum Kurs erneut zu besuchen. Navigieren Sie wie zuvor zu repl.it/languages/python3. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Zuerst, ist die Klasse. Versuchen Sie, eine Klasse namens Light zu erstellen. Halten Sie Ihr Video hier an, wenn Sie keinen Hinweis wünschen. Hier ist jetzt Ihr Hinweis. Dies ist das Format für eine Klassendefinition. Lasst uns jetzt die Lösung schreiben. Wir werden eine Klasse Licht definieren. Für diesen nächsten Schritt instanziieren wir diese Lichter. Instanziieren Sie die Light-Klassen zweimal, benennen Sie Ihre Instanzen a und b. Halten Sie Ihr Video hier an, wenn Sie keinen Hinweis wünschen. Nun, hier ist Ihr Hinweis. Dies ist das Format für die Instanziierung und das Zuweisen der Instanz zu einer Variablen. Lasst uns jetzt die Lösung schreiben. Es ist okay, wenn du nicht wüsstest, was du schreiben sollst. Hier werden wir in a eingeben ist gleich Licht und b ist gleich Licht. Als nächstes lassen Sie mich eine neue Möglichkeit einführen, ein Attribut für Ihre Klasse zu definieren. Hier ist deine Klasse. Wir werden definieren, was das Klassenattribut genannt wird indem wir eine Variable im Körper dieser Klasse definieren. Aktualisieren wir jetzt unseren Light-Code. Anstelle eines Passes werden wir hier eingeben auf ist gleich False. Um auf dieses Klassenattribut zuzugreifen, können wir direkt auf die Klasse und ihr Attribut verweisen, indem Sie einen Punktausdruck verwenden. Drücken Sie den „Grünen Pfeil“, um Ihren Code auszuführen. Jetzt werden wir den Dolmetscher benutzen. Der Dolmetscher für mich ist in der unteren Hälfte des Bildschirms, aber vielleicht auf der rechten Seite für Sie. Gehen Sie voran und geben Sie den Klassenname.on ein. Wir können sehen, dass der Standard False ist, wie wir hier definiert. Beachten Sie, dass Sie, wenn Sie eine Instanz definieren , auch auf dieses Attribut zugreifen können. Wenn wir beispielsweise eine.on eingeben, erhalten wir False und b.on wird auch False sein. Jetzt ist es Zeit für uns, das Geheimnis einzuführen. Versuchen wir, eines dieser Licht-Attribute zu ändern. Zuvor haben wir diese Attribute in einer Methode geändert. Wir können Attributwerte auch außerhalb der Methoden ändern. Ändern Sie Licht a, um eingeschaltet zu sein. Wir können eine.on gleich auf True setzen. Wie erwartet, wenn wir ein.on überprüfen, erhalten wir True. Was denkst du, passiert mit Licht b, es sollte immer noch ausgeschaltet sein. Wir können überprüfen, um herauszufinden, ob Licht b tatsächlich noch aus ist. Jetzt ist es Zeit für das Rätsel. Lassen Sie uns das Klassenattribut auf True ändern. Hier werden wir in Light.on eingeben ist gleich True. Was glaubst du, passiert mit Licht b? Es sollte immer noch ausgeschaltet sein, wir können überprüfen, aber Light.B ist an. Was ist hier passiert? Wir müssen uns visualisieren, um zu verstehen, was passiert ist. Wir haben damit begonnen, das Attribut der Klasse „Licht“ zu definieren, das deaktiviert ist. Wir haben dann eine neue Instanz wie erwartet definiert, diese neue Instanz ist immer noch deaktiviert. Wir haben dann das Klassenattribut in True geändert, so dass der Standardwert aktiviert ist. Das ist es, was wir erwartet haben. Wir haben erwartet, dass das instanziierte Licht nicht betroffen ist. Wir sahen jedoch, dass das instanziierte Licht betroffen war. Es war auch auf, was genau hier ist, b.on war auch True. Hier ist, was tatsächlich passiert ist. Wir haben das Attribut „Light“ -Klasse definiert, das standardmäßig deaktiviert ist. Als wir Licht instanziiert haben, hatte das Licht kein eigenes Attribut für ein oder aus. Stattdessen hatte die Light-Instanz immer noch ein Klassenattribut. Als Ergebnis, wenn wir das Klassenattribut ändern, änderten sich auch die Instanzen des Attributs. Takeaway ist, dass Klassenattribute immer gemeinsam genutzt werden. Lasst uns nun ein weiteres Geheimnis erforschen. Wir werden jetzt Light.on gleich False setzen. Was glaubst du, passiert mit dem Licht b, wie du vielleicht erwarten kannst? b ist jetzt auch Falsch. Was glaubst du, ist mit Light a passiert? Wenn wir eine.on eingeben, ist Licht a tatsächlich noch an. Was? Wie entkommt Licht ein das gemeinsame Attribut? Lassen Sie uns das mit einer anderen Visualisierung zusammenbrechen. Auf der linken Seite haben wir uns vorgestellt, was unserer Meinung nach passiert ist. Wir haben die Klasse in Schwarz und die beiden Instanzen unten. Wie wir im vorherigen Abschnitt erfahren haben, werden Klassenattribute gemeinsam genutzt. Verwenden wir stattdessen Pfeile. Früher haben wir tatsächlich manuell Licht a eingeschaltet. In diesem Fall konvertiert das Attribut direkt das Klassenattribut in ein Instanzattribut. Licht a ist nun entkoppelt und hat einen eigenen Zustand. Wir setzen dann das Klassenattribut auf True und setzen das Klassenattribut wieder auf False. Die ganze Zeit, Licht ein bleibt auf und ist unberührt. Takeaway ist, dass Klassenattribute gemeinsam genutzt werden, aber Instanzattribute nicht. Dies führt uns auch zu einem Tipp, um diese Verwirrung zu vermeiden. Der Tipp besteht darin, Klassenattribute in Ihrem Programm nicht zu ändern. Das erspart Ihnen die Kopfschmerzen, die wir illustriert haben. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Damit ist die Lektion abgeschlossen. In der nächsten Lektion stellen wir ein neues Konzept vor. 7. Konzept: Abstraktion: Willkommen zu einer anderen konzeptuellen Lektion, Abstraktion. Es wird keinen Code in dieser Lektion geben. Stattdessen diskutieren wir ein objektorientiertes Programmierkonzept namens Abstraktion, das die Lesbarkeit und Wartbarkeit Ihres Codes verbessert. Lassen Sie mich erklären, welche Abstraktion mit unserem Eis-Beispiel ist. Das ist unsere Folie von vorher. Beachten Sie, dass wir die Erwartungen jeder Eisinstanz skizziert haben, denen wir begegnen. Für jede Eisinstanz wissen wir, was die Eisinstanz macht und welche Daten jede Eisinstanz hat. Zum Beispiel können wir eine Eisinstanz essen. Aber noch wichtiger ist, dass wir eine Eisinstanz essen können ohne zu wissen, wie die Eat-Methode implementiert wird. Der letzte Teil ist der Schlüssel. Als Benutzer von Eiscreme-Instanzen können wir abstrahieren und ignorieren, wie diese Methoden funktionieren. Wir brauchen nur eine grobe Beschreibung dessen, was die Methode tut. Wir nennen diesen Begriff der Abstraktion von Details Abstraktion. Um diese Definition genauer zu wiederholen, besteht die Idee der Abstraktion darin, unnötige Details für den Benutzer zu entfernen. In unserem Beispiel ist der Benutzer der Eisdiele. Die Person, die isst, weiß, dass sie das Eis essen oder Schaufeln hinzufügen können. Die unnötigen Details, wie das Eis mit Essen umgeht, werden abstrahiert. Dies verbessert die Lesbarkeit Ihres Codes. Wir werden jetzt diskutieren, welche Abstraktion sich versteckt. Was ist das für unnötige Informationen? Dieser nächste Abschnitt veranschaulicht ein verwandtes Konzept namens Kapselung. In der Mitte haben wir unsere beiden Methoden essen und hinzufügen. Auf der rechten Seite in blau haben wir Methodenbeschreibungen für externe Benutzer, dass jede Methode erlaubt es Benutzern zu essen, bis kein Eis mehr übrig ist. Die Add-Methode ermöglicht es externen Benutzern, mehr Eis hinzuzufügen. Auf der linken Seite in rot, wir haben die internen Abläufe jeder Methode intern oder halten Konto für die Anzahl der noch verbleibenden Schaufeln. Nicht zu überraschend, essen einfach subtrahiert eine Schaufel, und fügen Sie einfach eine Schaufel hinzu, die roten internen Details sind weg von externen Benutzern versteckt. Um dies zu erzwingen, verwenden wir Kapselung. Wir werden die Kapselung nicht zu sehr betonen. Wissen Sie nur, dass bei der Kapselung der Zugriff auf interne Informationen beschränkt wird, wie das Erzwingen, dass Scoops nicht von Außenstehenden geändert werden können. In einigen Kapselung verbirgt Informationen vom Benutzer. Wenn Sie über den Unterschied zwischen Abstraktion und Kapselung verwirrt sind , ist das in Ordnung. Den Unterschied auch nach Abschluss dieses Kurses nicht zu kennen, ist in Ordnung. Verwendung von Abstraktion und Kapselung, je nachdem, welche auch immer sie ist, ist der wichtige Teil. Jetzt werden wir einen Vorteil der Abstraktion diskutieren, die Redundanz im Code zu entfernen ist. Diese Redundanzentfernung ist, wie Abstraktion tatsächlich die Wartbarkeit Ihres Codes verbessert. Hier ist, wie Abstraktion Redundanz entfernt. Auf der rechten Seite haben wir einen Eiskegel. Es unterstützt die Add-Methode, die eine Kugel Eis hinzufügt. Auf der linken Seite haben wir einen Eiswagen. Es macht Sinn, dass wir bei der Bestellung vom Eiswagen auch eine Kugel Eis hatten. Was ist jedoch, wenn wir das Verhalten des Scoop-Hinzufügens ändern möchten? Jetzt können wir nur einen Messlöffel hinzufügen, wenn die Gesamtzahl der Messlöffel kleiner als drei ist. Wir müssen diese Beschränkung auch überall dort hinzufügen, wo wir eine Kugel Eis hinzufügen, wie im Eiswagen. Als nächstes, was, wenn wir eine weitere Änderung hinzufügen? Wenn keine Messlöffel mehr vorhanden sind, fügen Sie drei Messlöffel gleichzeitig hinzu. Wir müssen das auch hinzufügen, wo immer wir eine Kugel Eis hinzufügen, wie im Eiswagen, das wird schnell zu einem Wartungsalptraum. Hier ist der Grund. Was passiert, wenn diese beiden Kopien des Scoop-Hinzufügens Code nicht synchron sind? Dann beginnt sich das Eis auf unerwartete Weise zu verhalten. Sie haben vielleicht etwas Eis mit mehr als drei Kugeln, zum Beispiel. Diese unerwarteten Verhaltensweisen verursachen Fehler in der Produktion, also achten Sie darauf. Aber wie beheben wir das? Wir wollen nur eine Kopie des Scoop Code hinzufügen. Ganz einfach, jeder Code, der Eisportionen hinzufügt , sollte die Eisklassen Add-Methode aufrufen. Niemand sonst sollte die Anzahl der Messlöffel in einem Eiskegel direkt ändern. Durchsetzung dieser Abstraktion ermöglicht es uns, Redundanz im Code zu reduzieren. Tipp. Überprüfen Sie auf redundanten Code. Wenn Ihre Kopie redundanten Code einfügen oder schreiben, machen Sie es falsch. Wir erläutern, warum und wie, wenn wir mit der Programmierung beginnen. Abstraktion entfernt unnötige Informationen. Zum Beispiel müssen Sie nicht wissen, wie Eisessen funktioniert, um die Eat-Methode zu nennen. Dies verbessert die Lesbarkeit Ihres Codes macht es einfacher und schneller zu verstehen. Die Kapselung verbirgt oder schränkt den Zugriff auf Informationen ein. Sie können beispielsweise nicht auf die Anzahl der Eisportionen zugreifen, die direkt verblieben sind. Schließlich entfernt Abstraktion Redundanz und Code, Subtraktion verbessert auch die Wartbarkeit Ihres Codes. Vergiss die Abstraktion nicht. Hier ist eine Zusammenfassung der Konzepte, die wir bisher behandelt haben. Eine Kopie dieser Folien und weitere Ressourcen finden Sie auf der Kurs-Website. Damit ist unsere Lektion, Abstraktion, abgeschlossen. In der nächsten Lektion werden wir einen Eiswagen simulieren , der die Abstraktion korrekt implementiert. 8. Übung: Eiscremewagen: In dieser Lektion werden wir Abstraktion üben, indem wir eine Eiskarre Klasse erstellen. Sobald Sie diese Seite sehen, schulden Sie das Projekt daran, Ihre eigene editierbare Kopie zu erhalten. Klicken Sie dazu auf den Projektnamen oben links, um ein Dropdown-Menü zu erhalten, klicken Sie auf die Auslassungspunkte, um eine weitere Dropdown-Liste zu erhalten, und klicken Sie schließlich auf die Schaltfläche Gabel. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Sie sollten dann Code sehen, der dem ähnelt, den ich auf der rechten Seite sehe. Wenn Sie nach unten scrollen, sehen Sie den Eiskurs, den wir in der letzten Lektion geschrieben haben. Der erste Schritt besteht darin, unsere Add Scoops Funktionalität zu ändern. Wenn wir mehr als drei Kugeln haben, sollte unser Eis umkippen uns mit Null Kugeln verlassen. Innerhalb unserer Add-Methode sollten wir zuerst überprüfen, ob es mehr als drei Messlöffel gibt. Hier geben wir ein, wenn self.scoop größer als drei ist, dann setzen Sie die Anzahl der Schaufeln auf Null. Wir werden auch hier eine Druckaussage hinzufügen, um zu erklären, was mit dem Benutzer passiert ist. Hier drucken wir: „Zu viele Schaufeln! Eiscreme fallen gelassen.“ Bevor Sie jedoch weitermachen, hier ist ein Tipp. Vermeiden Sie magische Zahlen. Magische Zahlen sind beliebige Zahlen, die direkt in den Code geschrieben werden, wie diese drei und das ist Null. Nullen sind einfach genug, um zu begründen, aber warum drei? Wir wissen, drei ist die maximale Anzahl von Schaufeln. Aber in komplexeren Programmen werden magische Zahlen für andere Programmierer schwieriger zu verstehen. Stattdessen sollten wir diese drei durch eine Variable namens max scoops ersetzen, die den Wert drei hat. Lass uns das jetzt machen. Für unsere Variable definieren wir ein Klassenattribut namens max scoops. Lasst uns das jetzt auf Code machen. Innerhalb Ihrer Eis-Klasse werden wir maximale Messlöffel gleich drei definieren. Wir können dann dieses Klassenattribut unten anstelle der Zahl 3 verwenden. Hier werden wir anstelle von Nummer 3 in der Add-Methode schreiben, self.max scoops. Lassen Sie uns jetzt diese Eis-Klasse verwenden und sehen, wie Abstraktion in der Praxis respektiert werden kann. Klicken Sie auf den grünen Pfeil oben, um Ihre Datei auszuführen. Jetzt instanziieren Sie Ihr Eis. Dann nehmen wir an, wir wollen Schaufeln hinzufügen, wir können direkt die Anzahl der Schaufeln ändern, Eis. scoops plus gleich zwei. Aber denken Sie daran, wir möchten die Anzahl der Messlöffel auf Null setzen. Wenn wir drei Kugeln überschreiten, könnten wir damit beginnen, dies zu programmieren. Wenn Eis Schaufeln größer als drei, aber das sollte vertraut erscheinen. Wir haben diesen Code gerade in die Add-Methode geschrieben, diese Vertrautheit, diese Redundanz, sollte eine rote Flagge sein. Darüber hinaus sollten wir das scoops-Attribut nicht direkt ändern. Wir folgen der Abstraktion nicht richtig. Stattdessen sollten wir die Add-Methode verwenden, die wir bereits geschrieben haben. Hier sollten wir stattdessen Eis schreiben.add (2) und hier werden wir feststellen, dass unsere Funktionalität tatsächlich eintritt. Wir haben jetzt mehr als drei Kugeln im Eis, also stürzen wir um und wir haben nur keine Kugeln. Wir könnten den gleichen Fehler wiederholen. Angenommen, Sie möchten die Anzahl der Messlöffel verringern. Wir könnten Eis eingeben. scoops minus gleich drei. Aber dann warten Sie, wir wollen überprüfen, ob genug Schaufeln übrig sind, bevor Sie subtrahieren. So können wir eingeben: „Wenn Eiscreme.scoops weniger als drei“, und wieder, sie sollten vertraut erscheinen. Wir haben diese Logik gerade in der Eat-Methode geschrieben. Das ist unsere rote Fahne. Wir sollten die Eat-Methode verwenden. Anstatt dies zu schreiben, werden wir jetzt Eiscreme.eat (3) geschrieben. Das wird uns geben, nicht genug Bisse übrig. Tipp, überprüfen Sie auf redundanten Code. Wenn Sie redundanten Code kopieren oder schreiben, machen Sie es wahrscheinlich falsch, und hier ist der Grund. Der redundante Code erschwert die Wartung von Code. Insbesondere wird ein Update auf eine Kopie möglicherweise nicht an die andere Kopie dieses Codes weitergegeben. Sie haben dann langsam divergierende Kopien von Code, die beide versuchen, dasselbe zu tun Überprüfen Sie also auf redundanten Code, stellen Sie sicher, dass Sie die Abstraktion respektieren. Wir werden nun eine neue Eiscreme-Lkw-Klasse skizzieren. Als Auffrischung, hier ist das Format. Definieren Sie Ihre neue Klasse mit dem Klassennamen, zwei Leerzeichen und übergeben Sie für den Körper der Klasse. Wir werden einen Eiswagen definieren und vorerst passieren. Definieren Sie dann Ihre Methoden. Sie benötigen eine Methode Bestellung, damit Kunden ihre Eiszapfen bestellen können. Für diese Methode müssen wir wissen, wie viele Messlöffel anfänglich hinzugefügt werden sollen. Löschen Sie „Pass“ und fügen Sie nun „Order“ mit dem Argument „self“ und der Anzahl der anfänglich hinzuzufügenden Scoops hinzu. Wieder geben wir den Pass ein und füllen den Körper unserer Methode später aus. Wir haben auch eine zweite Methode namens add, so dass Kunden Nachfüllungen für ihre Eiscremezapfen bestellen können. Für diese Methode benötigen wir das Eis, um zwei hinzuzufügen und wie viele Messlöffel hinzuzufügen. Definieren Sie die Add-Methode, aber das Selbst-Argument, und dann das Eis, das hinzugefügt werden soll, und die Anzahl der hinzuzufügenden Kugeln. Wiederum verwenden Sie Pass und wir füllen die Methode später aus. Lasst uns jetzt die Eiscreme-LKW-Klasse ausflippen. Innerhalb der Bestellmethode erstellen wir eine neue Eisinstanz. Hier haben wir Eis gleich einer neuen Eisinstanz. Wir werden jetzt Schaufeln hinzufügen. Wir haben unsere Lektion von vorher gelernt, wir werden die Add-Methode aus Eis verwenden anstatt das Schaufelattribut direkt zu ändern. Geben Sie nun Eiscreme.add und die Anzahl der Messlöffel. Zum Schluss das Eis an den Kunden zurückgeben. Wir werden auch die Add-Methode beenden. Diese Methode ist ziemlich einfach. Fügen Sie Messlöffel zum Eis hinzu, so Eiscreme.fügen Sie Messlöffel hinzu. Lassen Sie uns jetzt verfolgen, wie viele Schaufeln wir verkaufen. Wir müssen einen Konstruktor hinzufügen, der die Anzahl der auf Null verkauften Schaufeln initialisiert. Hier werden wir einen neuen Konstruktor mit dem self Argument definieren und die Anzahl der verkauften Schaufeln gleich Null setzen. Als Nächstes aktualisieren wir dann die Anzahl der in der Bestellmethode verkauften Schaufeln. In der Bestellmethode fügen wir die Anzahl der verkauften Schaufeln hinzu. Schließlich, in der Add-Methode, werden wir dies noch einmal tun, wir füllen die Anzahl der verkauften Schaufeln aus. Aber warte, wir haben gerade diese Codezeile oben geschrieben. Wenn Sie diese beiden Zeilen 37 und 38 mit den beiden obigen Zeilen 32 und 33 vergleichen 37 und 38 mit den beiden obigen Zeilen , sehen Sie, dass sie identisch aussehen. Das ist wieder eine rote Fahne. Wir haben redundanten Code, wir könnten die Abstraktion brechen. Es stellte sich heraus, dass wir es sind Diese Methode fügen Sie für den Eiswagen Griffe Hinzufügen von Schaufeln zu einem Eis, so sollten wir mit den Eiswagen hinzufügen Methode, um Schaufeln zu einem Eiskegel hinzuzufügen. Stattdessen lassen Sie uns die Zeilen 32 und 33 löschen und stattdessen diese durch selbst.add Eisportionierer. Wir respektieren jetzt die Abstraktion für unseren Eiswagen. Tipp: Wenn Sie den Vertrag verstehen, den eine Klasse bereitstellt, können Sie Code innerhalb der Klasse organisieren. Sie verstehen, dass die Add-Methode Hinzufügen von Scoops und die Buchhaltung einer Reihe von verkauften Schaufeln verarbeitet , bedeutet dies, dass wir diese Add-Methode verwenden können, anstatt beide Schritte manuell zu tun, uns vom Schreiben von redundanten Code erspart. Lasst uns jetzt diesen Eiswagen Klasse benutzen. aus unseren bisherigen Fehlern lernen, wissen wir jetzt, Abstraktion zu respektieren. Drücken Sie erneut den grünen Pfeil oben in der Datei, um Ihren Code auszuführen. Beachten Sie, dass es jetzt eine neue Ebene der Abstraktion gibt. Wir sollten keine Eiskegel direkt erstellen oder hinzufügen, stattdessen sollten wir beim Eiswagen bestellen. Lassen Sie uns jetzt einen neuen Lkw erstellen. Bestellen Sie Eis mit drei Messlöffel. Hier haben wir Eis eins ist gleich LKW.bestellen Sie mit drei Eisportionen, dann essen Sie etwas von dem Eis. Jetzt bestellen wir noch mehr Eis aus dem LKW. Wir werden in Truck zu tippen.fügen Eis ein und fügen Sie eine Kugel. Mal sehen, wie viele Schaufeln die Eiswagen verkauft. Sieht gut aus. Die ursprüngliche Bestellung war für drei Messlöffel und wir haben eine weitere Schaufel hinzugefügt, so dass insgesamt vier Kugeln verkauft wurden. Für eine Kopie dieser Folien und der fertige Code für diese Lektion vergewissern Sie sich, dass Sie die Kurs-Website besuchen. In dieser Lektion haben wir einige Abstraktionsübungen mit einem Eiswagen behandelt. Insbesondere haben Sie gesehen, wie ich es versäumt habe, Abstraktion zu verwenden und wie man das beheben kann. Erinnern Sie sich an die drei Tipps aus dieser Lektion, vermeiden Sie magische Zahlen, suchen Sie nach redundanten Code und seien Sie sich über Erwartungen im Klaren. Die nächste Lektion ist Bonuspraxis. 9. (Bonus) Übung: Synchronisierte Lichter: In dieser Lektion werden wir mehr von dem Abstraktionskonzept, das wir besprochen haben, üben. Dieses Mal bauen wir auf unserer Lichtsimulation auf, indem wir einige der Lichtschalter synchronisieren. Navigieren Sie zu dieser URL, um zu beginnen. Sobald Sie diese Seite sehen, verzweigen Sie das Projekt, um Ihre eigene editierbare Kopie zu erhalten. Klicken Sie dazu oben links auf den Projektnamen, um ein Dropdown-Menü zu erhalten. Klicken Sie auf die Auslassungspunkte, um eine weitere Dropdown-Liste zu erhalten, und klicken Sie schließlich auf die Schaltfläche Gabel. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Bevor wir beginnen, möchte ich ein neues Konzept vorstellen, das Sie noch nicht gesehen haben, ein Standardargument in Python. Beginnen wir mit der Definition einer Subtraktionsfunktion. Zur Erinnerung: Hier ist das Format zum Definieren einer Funktion. Für einmal ist diese Formatfolie tatsächlich der genaue Code, den wir schreiben werden. Lasst uns jetzt unseren Code schreiben. Ihr Code auf der rechten Seite sollte mit meinem übereinstimmen. Wenn Sie nach unten scrollen, sehen Sie die Lichtklasse, die wir in früheren Lektionen definiert haben. Direkt über dieser Lichtklasse werden wir die Sub-Methode definieren, die wir auf der linken Seite sehen. Gehen Sie weiter und tippen Sie aus, definieren Sie sub (x, y) und geben Sie x minus y zurück. Lassen Sie uns jetzt diese Objektivfunktion verwenden. Wir rufen sub mit Eingang sieben und vier an. Gehen Sie weiter und drücken Sie den grünen Pfeil ganz oben, um Ihren Code auszuführen. Geben Sie dann unter 7, 4 ein, um drei zu erhalten. Was passiert, wenn man das zweite Argument vergisst? Was ist, wenn wir sub sieben eingeben und „Enter“ drücken? Nun, Sie erhalten einen Fehler und Ihr Fehler wird so aussehen. Es sagt dir, dass du dein zweites Argument vermisst. Lassen Sie uns eine weitere Subtraktionsfunktion unter zwei definieren. Dieses Mal werden wir y ein Standardargument von Null zuweisen. Lasst uns jetzt unseren Code schreiben. Wir werden sub2 x definieren, aber jetzt geben wir y gleich Null ein und alles andere bleibt gleich. Dieses Gleichheitszeichen in der Funktionsdefinition gibt y einen Standardwert. Es weist nicht immer y auf Null zu. Die Funktion weist y nur Null zu, wenn Sie kein zweites Eingabeargument angeben. Lassen Sie uns das in Aktion sehen. Führen Sie zuerst die Datei aus, indem Sie den grünen Pfeil ganz oben drücken. Mal sehen, was passiert, wenn wir beide Argumente wie zuvor übergeben. Geben Sie sub2 7, 4 ein und wie erwartet erhalten wir drei. Hier wird x sieben zugewiesen und y vier zugewiesen. Mal sehen, was passiert, wenn wir nur ein Argument übergeben. Geben Sie sub2 7 ein und es stellt sich heraus, dass es keinen Fehler gibt und wir sieben herausbekommen. Was ist hier passiert? Dies liegt daran, dass x sieben zugewiesen wurde und y automatisch Null zugewiesen wurde. Wir haben 7 minus 0. Lassen Sie uns nun ein verwandtes Konzept namens Schlüsselwortargumente abdecken. Dies wird am besten anhand eines Beispiels erklärt. Lassen Sie uns die vorherige Version mit zwei Eingabenummern erneut ausführen. Hier werden wir sub2 7,4 haben. Hier wird sieben auf x und der zweite Eingang vier ist zu y zugeordnet. Sie drücken „Enter“, wir erhalten 7 minus 4, das ist 3. Wir können Python auch explizit mitteilen, welche Eingabe x ist und welche Eingabe y ist. Hier können wir sub2 eingeben, x gleich sieben und y ist gleich vier. Wir können „Enter“ drücken und wir bekommen immer noch drei. Wir nennen diese x gleich sieben, y ist gleich vier Schlüsselwortargumente. Sie können Schlüsselwortargumente in beliebiger Reihenfolge angeben. Hier können wir die x und die y-Schlüsselwort-Argumente sub2 wechseln, y ist gleich vier, x ist gleich sieben. Drücken Sie „Enter“ und Sie erhalten immer noch drei. Beachten Sie, dass Sie, wenn Sie keine Schlüsselwortargumente verwenden und die Eingaben wechseln, etwas anderes erhalten. Ich werde meine Ausgabe löschen, so dass Sie den unteren Rand meines Bildschirms sehen können und hier werden wir sub2 4 eingeben, 7 die Reihenfolge wechseln, ohne Schlüsselwortargumente zu verwenden, und hier ist die Ausgabe anders. Wir werden negativ 3, weil wir jetzt 4 minus 7 statt 7 minus 4 haben. Nun, da Sie Standardargumente und Schlüsselwortargumente abgedeckt haben, lassen Sie uns sie in unserer neuen Klasse verwenden. Wir werden nun endlich an dem Abstraktionskonzept arbeiten. Wir werden die Möglichkeit hinzufügen, zwei Lichter zu synchronisieren, so dass Umschalten wie Nummer 1 auch wie Nummer 2 umschaltet. Gehen Sie weiter und scrollen Sie zu Ihrer Lichtklasse. Wir fügen dem Konstruktor ein Argument namens sync hinzu. Dieses Argument hat einen Standardwert von none mit einem Großbuchstaben N. None bedeutet nur leer. Die Absicht ist, die Synchronisierung auf ein anderes Licht zu setzen, mit dem synchronisiert werden soll. Du wirst in einer Sekunde sehen, was ich meine. Hier werden wir Licht definieren, nachdem das Selbstargument Komma Sync gleich keiner ist. Wir können dann das Eingabeargument Sync als instanziertes Attribut auch Sync genannt setzen. Hier werden wir self.sync gleich schreiben, um zu synchronisieren. Lassen Sie uns jetzt das Sync-Attribut verwenden, wenn es nicht leer ist, oder mit anderen Worten, wenn das Sync-Attribut nicht keines ist, dann schalten Sie die Synchronisierung auf Licht. Gehen Sie weiter und scrollen Sie nach unten zu Ihrer Umschaltmethode. Hier werden wir eingeben, wenn self.sync sync nicht keine ist, dann schalten Sie die Sync Licht. Hier könnten Sie versucht sein, das Sync-Licht einfach selbst umzuschalten, indem Sie in self.sync.on schreiben , gleich nicht self.sync.on. Sie würden jedoch die Abstraktion brechen. Was ist, wenn das Licht mit einem anderen Licht synchronisiert wird? Dann müssten wir überprüfen, ob self.sync.sync nicht keine ist und so weiter und so weiter. Wow, das ist redundanter Code. Redundanter Code ist also wie immer eine große rote Flagge. Stattdessen müssen wir Abstraktion, self.sync als Licht respektieren und wir können Lichter umschalten, indem wir ihre Toggle-Methode aufrufen. Stattdessen werden wir self.sync.toggle schreiben. Dies schließt unsere synchronisierten Lichter ab. Jetzt werden wir das synchronisierte Licht instanziieren und verwenden. Gehen Sie weiter und drücken Sie den grünen Pfeil ganz oben, um Ihren Code auszuführen und jetzt lassen Sie uns unser allererstes Licht instanziieren. Licht 1 ist gleich Licht. Instanziieren Sie Ihr zweites Licht, aber dieses Mal setzen Sie das Sync-Eingabeargument auf das erste Licht. Dies stellt sicher, dass, wenn wir Licht Nummer 2 umschalten, Licht Nummer 1 auch umschalten. Hier definieren Licht Nummer 2 ist gleich Licht, stellen Sie Sync gleich dem ersten Licht. Mal sehen, ob Licht Nummer eins eingeschaltet ist. Wir werden light1 eingeben. ist eingeschaltet. Es sieht so aus, als wäre unser erstes Licht nicht an. Nun, lasst uns Licht Nummer 2 umschalten. Dies sollte sowohl Licht Nummer 1 als auch Nummer 2 einschalten. Hier haben wir light2.toggle und lassen Sie uns überprüfen, dass Licht Nummer 1 jetzt eingeschaltet ist. Lichtnummer 1 ist eingeschaltet und es ist jetzt eingeschaltet. Toll, es funktioniert. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Dies schließt unsere zusätzliche Abstraktionspraxis ab. 10. Konzept: Vererbung:: Willkommen zu einer anderen konzeptuellen Lektion, Vererbung. Um die Vererbung zu verstehen, müssen wir eine „ist eine“ Beziehung verstehen. Zum Beispiel ist Eis ein Beispiel für Lebensmittel. Wir wissen das, weil man essen und Eis essen kann. Eis kann jedoch auch einige zusätzliche Methoden haben, die andere Lebensmittel nicht, wie zum Beispiel schmelzen. Da Eis ein Beispiel für Lebensmittel ist, definieren wir Eis als Kinderklasse von Lebensmitteln. Wir können auch sagen, dass Eis Unterklasse als Essen ist. Wir nennen Essen die Elternklasse. Das Definieren dieser „ist eine“ Beziehung gibt uns einen interessanten Vorteil namens Vererbung. Hier ist, wie Vererbung funktioniert. Für alle Lebensmittel erwarten wir, dass wir die Eat-Methode haben. Da Eis eine Kinderklasse von Lebensmitteln ist, erbt Eis automatisch die Eat-Methode. Sie können so viele untergeordnete Klassen von Lebensmitteln hinzufügen, wie Sie möchten und alle von ihnen erben die gleiche Ess-Funktionalität. Lassen Sie uns diese Analyse mit einem anderen Beispiel wiederholen. Ein Eiswagen ist ein Lastwagen. Insbesondere verfügt ein Eiswagen über alle Eigenschaften, die ein LKW hat und vieles mehr. Infolgedessen definieren wir Eiswagen als Kinderklasse von Lkw. Das gibt uns einen raffinierten Vorteil. Wir erwarten, dass alle Lkw die Antriebsfunktionalität oder -methode haben. Da Eiswagen ist eine Kinderklasse von LKW, es erbt die Antriebsmethode zu. Schließlich kann Eiswagen einige zusätzliche Methoden haben , die andere LKWs nicht, wie bestellen. Zusammenfassend ist A ein B, wenn A alle Eigenschaften hat, die B hat; zum Beispiel ist Eis ein Lebensmittel. Da Eis alle Eigenschaften von Lebensmitteln hat, bedeutet dies, dass Eis die gesamte Funktionalität des Essens erbt. Standardmäßig ist das Essen von Eis wie ein anderes Essen. Was aber, wenn das nicht wahr ist? Was ist, wenn das Essen von Eis drastisch anders ist als andere Lebensmittel zu essen? Mit anderen Worten, wir wollen die standardmäßige geerbte Funktionalität überschreiben. Dies ist unser nächstes Konzept in der Vererbung, überschreiben. Zuvor sagten wir, dass Eis die Essensmethode von Lebensmitteln erben würde , da Eis ein Lebensmittel ist. Nehmen wir jedoch an, das Eis essen ist einzigartig und im Gegensatz zu allgemeinen Essen essen. Wir müssten die Eat-Methode außer Kraft setzen eine benutzerdefinierte Eat-Methode für Eis speziell definieren. Vielleicht möchten wir essen überschreiben, weil wir die Menge repräsentieren, die auf verschiedene Arten gegessen wird. Mit Eis messen wir die Menge, die in Kugeln übrig bleibt. Bei anderen Lebensmitteln verwenden wir einen Prozentsatz. Zusammenfassend erbt die untergeordnete Klasse standardmäßig die Methode von einer übergeordneten Klasse. Die untergeordnete Klasse kann diese Methoden jedoch überschreiben oder neu definieren. Diese beiden Konzepte sind die zentralen Takeaways. Wir werden die letzten beiden Bonuskonzepte nach einer kurzen Zusammenfassung dessen, was wir bisher gelernt haben, abdecken . Unser erstes Konzept, die „is a“ -Beziehung, sagt uns, welche Klassen sich unterordnen. Da Eis ist Essen, Eis Unterklassen Lebensmittel. Eis erbt dann Methoden von Lebensmitteln. Wir können jedoch auch Eis überschreiben geerbte Methoden von Lebensmitteln, wenn nötig. Für eine Kopie dieser Folien und mehr Ressourcen, stellen Sie sicher, dass Sie die Kurs-Website überprüfen, und das schließt unsere Lektion über die Vererbung. Es gab viele wichtige Ideen in dieser Lektion, aber die wichtigsten Takeaways oder die „ist eine“ Beziehung und überschreiben. Mach dir keine Sorgen, wenn die Details schlammig sind. Wir werden diese Ideen in der nächsten Lektion konkreter machen, wenn wir mit dem Programmieren beginnen. Wir werden nun zwei weitere kurze Bonuskonzepte abdecken. Wenn Sie sich überwältigt fühlen oder gerade keine Bonusinhalte wünschen, können Sie mit der nächsten Lektion fortfahren. Eine Schnittstelle, wie die Food Interface auf der rechten Seite, skizziert einfach Erwartungen, bietet aber keine Standardimplementierungen. Hier gibt Essen eine Eat-Methode und eine Add-Methode an, implementiert aber auch nicht. Eis implementiert die Lebensmittelschnittstelle mit nutzbaren Implementierungen für beide Methoden. Unser letztes Konzept ist eine Abstraktion. Ein Abstract definiert auch Erwartungen für eine Unterklasse. Es kann jedoch einige Methoden implementieren und andere Methoden nicht implementiert lassen. Hier implementiert die Lebensmittelabstrakte die Eat-Methode und gibt eine Add-Methode an, ohne sie zu implementieren. Eis unterzieht das Essen abstrakt und füllt die Add-Methode Implementierung, und das schließt die Lektion über die Vererbung, einschließlich der Bonuskonzepte. In der nächsten Lektion beginnen wir, einige dieser Vererbungskonzepte zu codieren. 11. Übung: Deluxe-Eiscremewagen: Um Vererbung zu praktizieren, werden wir einen DeluxeRecreamTruck machen. Dieser DeluxeiceCreamTruck, gibt Ihnen eine kostenlose Schaufel mit Ihrer Eisbestellung. Navigieren Sie zu dieser URL, um zu beginnen. Sobald Sie diese Seite sehen, verzweigen Sie das Projekt, um Ihre eigene editierbare Kopie zu erhalten. Um dies zu tun, klicken Sie auf den Projektnamen oben links, um eine Dropdown-Liste zu erhalten. Klicken Sie auf die „Ellipse“, um eine weitere Dropdown-Liste zu erhalten. Klicken Sie abschließend auf die Schaltfläche „Fork“. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Sie werden direkt in das Schreiben einer Unterklasse springen. Hier ist das Format. Wir haben unsere normale Klassendefinition, außer wir schließen die Elternklasse in lila in Klammern ein, wie wir hier sehen. In diesem Beispiel ist ice die untergeordnete Klasse und H_2O die übergeordnete Klasse. Lassen Sie uns dieses Format jetzt für unseren DeluxeRecreamTruck verwenden. Nachdem Sie die andere repl.it gegabelt haben, sollten Sie den Code wie meins auf der rechten Seite sehen. Unter dem gesamten vorhandenen Code definieren wir jetzt unseren DeluxeRecreamTruck. Erstellen Sie zuerst DeluxeIceCreamTruck Klasse, dann Unterklasse Eiswagen, wie wir besprochen, geben Sie in der Klasse DeluxeRecreamTruck und unterordnen Sie den Eiswagen mit einem Doppelpunkt. Wir können Pass hier als Platzhalter hinzufügen. Jetzt müssen Sie die Bestellmethode außer Kraft setzen, da der DeluxeIceCreamTruck bei jeder Bestellung eine kostenlose Schaufel anbietet. Dies ist das Format zum Definieren einer Methode. Das Überschreiben einer Methode erfordert keine spezielle Syntax. Definieren Sie einfach die Methode in der untergeordneten Klasse neu. Hier werden wir Ihre Bestellmethode definieren. Löschen Sie den Durchlauf und definieren Sie die Reihenfolge. Auch hier brauchen Sie selbst als erstes Argument und es akzeptiert ein Argument, scoops. Wie zuvor kreieren wir ein neues Eis. Dann rufen wir die self.add Methode und übergeben die Anzahl der Schaufeln. Aber warte, das ist genau wie vorher. Das ist deine rote Fahne. Wie wir schon sagten, redundanter Code bedeutet, dass etwas nicht stimmt. Wie können wir unsere ursprüngliche Bestellmethode weiter oben verwenden? Wir sind speziell daran interessiert, unsere übergeordnete Klassenmethode aufzurufen. Hier erfahren Sie, wie Sie das tun. Um die Methode der übergeordneten Klasse aufzurufen, verwenden Sie einfach die Superinstanz. Lassen Sie mich Ihnen jetzt im Code zeigen. Wir rufen super.order an und übergeben das Scoops-Argument. Hier geben wir anstelle dieser beiden Zeilen super.order ein und übergeben Scoops. Hier ruft dies die übergeordnete Methodenreihenfolge auf. Diese Methode gibt die Eisinstanz. Setzen Sie diese Instanz also auf eine Variable. Hier werden wir Eis gleich super.order haben. Dann fügen wir eine kostenlose Kugel Eis hinzu, ohne die Anzahl der verkauften Messlöffel zu aktualisieren. Hier schreiben wir, ice_cream.add1. Falls Sie sich fragen, warum verwenden wir nicht die Eiscreme-Trucks Add-Methode? Die Add-Methode, die von der übergeordneten Klasse geerbt wurde. Wir verwenden jedoch nicht die LKWs Add-Methode, da die LKWs Add-Methode auch die Anzahl der verkauften Schaufeln aktualisiert. In diesem konkreten Beispiel verschenken wir eine kostenlose Kugel Eis und wollen nicht eine Reihe von verkauften Schaufeln aktualisieren. So haben wir Eiscreme.add1. Zum Schluss, geben Sie das Eis an den Kunden zurück. Eine kurze Notiz. Eine gute Praxis besteht darin, den übergeordneten Klassenkonstruktor immer in Ihrem eigenen Konstruktor aufzurufen . Wir werden dies jetzt für andere Konstruktoren tun. Hier im Konstruktor für Eiscremewagen nennen wir super.init. Dann wiederholen wir das noch einmal für den Eiskurs. für das letzte Segment dieser Lektion Verwenden Siefür das letzte Segment dieser Lektiondie DeluxeRecreamTruck-Instanz. Wir werden auf den grünen Button oben klicken, um unseren Code auszuführen. Instanziieren Sie zunächst den DeluxeRecreamTruck. Hier haben wir LKW ist gleich DeluxeiceCreamTruck. Wir werden dann ein Eis mit zwei Messlöffel bestellen, Eis ist gleich Truck.order2, und Boom, das Eis, das wir zurück jetzt bekommen, hat drei Kugeln. Es enthält die eine kostenlose Schaufel, die wir hinzugefügt haben. Wir können überprüfen, indem wir ice_cream.scoops schreiben, und wir haben drei Kugeln. Wir können auch überprüfen, wie viele Schaufeln der Eiswagen verkauft hat. Hier werden wir in truck.sold eingeben, und wir erwarten nur zwei. Wie erwartet, bekommen wir zwei. Der Truck verkaufte nur zwei Schaufeln, und die dritte Schaufel war frei. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Damit wird die DeluxeIceCreamTruck-Praxis für Vererbung abgeschlossen. Die nächste Lektion ist eine Bonus-Übungslektion, um Vertrautheit mit diesen Ideen aufzubauen. 12. (Bonus) Übung: Flackernde Lichter: In dieser Lektion üben wir noch einmal die Vererbung aus. Dieses Mal machen wir ein altes Licht, das jedes zweite Mal flackert, wenn Sie es einschalten. Navigieren Sie zu dieser URL, um zu beginnen. Sobald Sie diese Seite sehen, verzweigen Sie das Projekt, um Ihre eigene editierbare Kopie zu erhalten. Klicken Sie dazu oben links auf den Projektnamen, um ein Dropdown-Menü zu erhalten. Klicken Sie auf die „Ellipse“, um eine weitere Dropdown-Liste zu erhalten, und klicken Sie schließlich auf die „Fork“. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Wir werden direkt in die Unterklasse unserer ursprünglichen Lichtklasse einsteigen. Hier ist das Format zum Definieren einer Unterklasse. In Ihrem Code sollten Sie eine Lichtklasse sehen, die wir in der vorherigen Lektion definiert haben. Scrollen Sie nach unten bis zum Ende der Datei. Hier definieren wir ein altes Licht, das die ursprüngliche Lichtklasse unterkauft. Wir geben hier vorerst einen Pass ein. Sie überschreiben nun die Umschaltmethode in der übergeordneten Klasse da unser Licht jedes zweite Mal flackern muss, wenn das Licht eingeschaltet wird. Wir werden jetzt unseren Konstruktor definieren, der Flicker auf false setzt. Dies bedeutet, dass die Standardeinstellung für alle Lichter nicht beim Starten flackern ist. Definieren Sie den Konstruktor mit dem self Argument mit sync gleich none. Erinnern Sie sich, dass dieses Standardargument in unserem ursprünglichen Klassenkonstruktor war. Wir müssen dann schreiben auf ist gleich falsch. Genau wie zuvor, wir schreiben Sync ist gleich Sync. Diese beiden Zeilen sehen überflüssig aus, und du hast Recht, sie sind, das sollte eine rote Flagge sein, wir werden das in einer Sekunde anpassen. Lassen Sie uns schließlich Flackern auf false setzen, so dass das Licht standardmäßig nicht flackert. Sie überschreiben nun die Umschaltmethode in der übergeordneten Klasse, da unser Licht jedes zweite Mal flackern muss, wenn das Licht eingeschaltet wird. Hier ist das Format zum Definieren einer neuen Methode. Direkt unter unserem Konstruktor definieren wir nun eine Toggle-Methode. Wie zuvor müssen wir das Licht von Ein zu Aus oder von Aus zu An wechseln. Wir schreiben hier self.on gleich nicht self.on. Wir müssen dann jedoch nach dem synchronisierten Licht suchen. Wenn self.sync nicht keine ist, sollte dies fischig erscheinen. Wir haben redundanten Code. Das ist eine rote Fahne. Dieser Code wiederholt einfach die Toggle-Methode des übergeordneten Elements. Die Lösung besteht darin, die übergeordnete Methode aufzurufen. Wir müssen die übergeordnete Methode aufrufen. So rufen Sie die übergeordnete Methode auf. Wir verwenden einfach die Superinstanz als Ersatz für unsere übergeordnete Instanz. Zurück in Ihrem Code werden wir diese beiden Zeilen tatsächlich löschen und stattdessen super () .toggle () schreiben. Bevor wir fortfahren, müssen wir tatsächlich den übergeordneten Konstruktor von jedem anderen Klassenkonstruktor aufrufen . Hier müssen wir den übergeordneten Konstruktor aufrufen. Der übergeordnete Konstruktor nimmt tatsächlich ein Sync-Argument ein. Im ursprünglichen Licht rufen wir auch den übergeordneten Konstruktor auf. Jetzt können wir die Toggle-Methode beenden. Wir überprüfen, ob das Licht eingeschaltet ist. Wenn ja, schalten Sie Licht flackern oder nicht, so jedes zweite Mal, wenn das Licht flackert. Wenn das Licht eingeschaltet ist , ändern wir, ob es flackert oder nicht. Das rundet unser altes flackerndes Licht ab. Lasst uns endlich dieses alte Licht benutzen. Gehen Sie weiter und klicken Sie auf den grünen Pfeil oben, um Ihren Code auszuführen. Dann instanziieren Sie Ihr altes Licht. Licht ist gleich altem Licht (). Überprüfen Sie, ob es flackert oder nicht, Licht. Flimmern. In der Tat flackert es nicht. Lassen Sie uns jetzt das Licht einschalten. Lassen Sie uns überprüfen, ob das Licht jetzt flackert. Es sollte sein und es ist in der Tat flackert. Lassen Sie uns das Licht dann wieder ausschalten und überprüfen Sie erneut, ob das Licht flackert. Dieses Mal sollte es nicht sein. In der Tat flackert es nicht. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Damit schließt unsere Praxis für das Vererbungskonzept mit alten flackernden Lichtern ab. In der nächsten Lektion werden wir über einen mysteriösen Fehler in der objektorientierten Programmierung sprechen, warum es passiert und wie man es repariert. 13. (Bonus) Rätsel: MRO: In dieser Lektion werden wir geheimnisvolle Fehler in Python behandeln. Dieser Fehler beruht auf einem Konzept namens Methodenauflösungsreihenfolge. Wie zuvor, beachten Sie, dass diese Geheimnisse einige der verwirrendsten Teile von OOP angesprochen. Wenn Sie sich überwältigt fühlen, schlage ich vor, diese Mystery Sessions auf dem ersten Durchgang zu diesem Kurs zu überspringen sie auf einem zweiten Durchgang erneut zu besuchen. Navigieren Sie wie zuvor zu repl.it/languages/python3, da wir von Grund auf neu beginnen werden. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Lassen Sie mich zunächst ein Konzept erklären, das als Mehrfachvererbung bezeichnet wird. Zuvor haben wir gesehen, dass eine Klasse eine andere Klasse unterklassifizieren kann. Zum Beispiel könnte Eis Lebensmittel unterklassifizieren, weil Eis eine Art von Nahrung ist. Was ist, wenn Eis auch ein Getränk ist? Weil das Eis schmelzen könnte? Dann wollen wir vielleicht, dass Eis sowohl Essen als auch Trinken unterstuft. Mal sehen, wie das im Code aussieht. Dies ist das Format. Hier, Klasse C Unterklassen sowohl A als auch B. Um dies zu lesen, lesen Sie von links nach rechts. Methoden in C können Methoden in A überschreiben. Methoden in A können Methoden in B überschreiben. Nur um den Überblick zu behalten, werden wir dies als A größer als B zusammenfassen, was bedeutet, A hat Vorrang vor B mit dieser obigen Notation. Lassen Sie uns nun den mysteriösen Fehler einführen. Hier ist wieder das Format. Lassen Sie es uns programmieren. Erstellen Sie Klasse A mit einem Platzhalterkörper. Erstellen Sie dann eine zweite Klasse B, die Unterklasse A. Klasse B Unterklasse A und einen Platzhalter für den Körper ist . Erstellen Sie schließlich eine dritte Klasse C, die sowohl A als auch B unterklassen Stellen Sie sicher, dass Sie Ihre Klassen in genau dieser Reihenfolge schreiben. A, B, dann übergeben Sie für Ihren Platzhalter. Versuchen Sie nun, Ihren Code mit dem grünen Pfeil auszuführen, führen Sie oben aus. Hier ist der geheimnisvolle Fehler, Methodenauflösungsfehler. Was bedeutet das, und wie ist das passiert? Lasst uns das zusammenbrechen. Um diesen Fehler zu verstehen, müssen wir ihn visualisieren. Zuerst B Unterklassen A in den Zeilen 4 und 5. B hat Vorrang vor A. Wir bezeichnen dies als B größer als A. Jedoch C Unterklassen sowohl A als auch B, wie wir hier geschrieben haben. Laut unserer Notation, A, B, bedeutet das, dass A Vorrang vor B hat. Wir bezeichnen dies als A größer als B Dies ist der Widerspruch. B ist größer als A und doch A ist größer als B, also welche, A oder B hat Vorrang? Das ist, worüber Python beschwert. Es weiß nicht, welche Klasse Priorität hat. Die nächste Frage ist natürlich, wie können wir das beheben? die Visualisierung, die wir zuvor gesehen haben, erneut untersuchen können wir wirklich alle diese Fehler entfernen, um das Problem zu beheben. Aber einer dieser Fehler ist leichter zu entfernen als die anderen. Wir können A und B neu definieren, so dass B keine Unterklasse A macht. Dies erfordert einen Paradigmenwechsel in der Art und Weise, wie wir Vererbung verstehen. In der nächsten Lektion besprechen wir genau, was dieser Paradigmenwechsel ist. Für eine Kopie dieser Folien und den fertigen Code für diese Lektion, stellen Sie sicher, dass Sie die Kurs-Website besuchen. Dies schließt eine Methode Auflösung Ordnung Geheimnis. Wir haben besprochen, wann der Fehler auftritt, warum er passiert, und eine Möglichkeit eingeführt, das Problem zu beheben. In der nächsten Lektion werden wir dies genauer behandeln. 14. Konzept: Mehr zur Vererbung: Das Ziel dieser Lektion ist es, Sie vor der Kurve zu stellen, um Ihren Code viel flexibler als andere zu machen. Es gibt zwei Konzepte, die Ihr objektorientiertes Programmierverständnis vertiefen , Mixins und Komposition. Zuvor haben wir viel über die „ist eine“ Beziehung in der Vererbung gesprochen. Ein gemeinsames Paradigma ist zum Beispiel zu sagen, dass ein Bus ein Fahrzeug ist, Transport ist. Aber was passiert, wenn man einen Bus hat, der in ein Zuhause umgebaut wurde? Es ist immer noch ein Bus, aber es ist nicht mehr wirklich ein Fahrzeug. In dieser Lektion werden wir unser Verständnis der Vererbung in der objektorientierten Programmierung verfeinern . Um zu verstehen, warum wir verfeinern müssen, lasst uns in das Kreiselellipsenproblem eintauchen. Dieser Abschnitt erfordert, dass Sie hart denken und hängt stark von Ihrem Verständnis der vorherigen Lektionen ab. Wenn Sie müssen, nehmen Sie zuerst Wasser oder machen Sie eine Dehnungspause. Erinnern Sie sich zuerst von der Schule, dass ein Kreis eine Ellipse ist. Um Ihr Gedächtnis zu jagen, warum das ist: Eine Ellipse hat zwei Achsen, wobei jede Achse eine andere Länge haben kann. Ein Kreis ist ein Sonderfall, bei dem beide Achsen die gleiche Länge haben. Ein Kreis ist also eine spezielle Art von Ellipse. Wir sagen, dass ein Kreis eine Ellipse ist. Erinnern Sie sich jedoch an unsere „ist a“ -Regel aus der Erbstunde. A ist ein B, wenn A alle Eigenschaften hat, die B hat. Einstecken, was wir wissen, ein Kreis ist eine Ellipse, da ein Kreis alle Eigenschaften hat, als Ellipse hat? Halt, das scheint wirklich falsch zu sein. Kreise haben nicht alle Eigenschaften, die eine Ellipse hat. Ein Kreis hat nur eine Achsenlänge; eine Ellipse hat zwei Achsenlängen. Wenn Sie wirklich darüber nachdenken, hat eine Ellipse alle Eigenschaften, die ein Kreis hat. Daher ist eine Ellipse ein Kreis. Unsere Lehrer irren sich also? Es stellte sich heraus, dass das auch nicht richtig ist. Ein Kreis hat einen Radius, aber eine Ellipse nicht. Ellipsen haben auch nicht alle Eigenschaften eines Kreises. Also nehme ich an, ein Kreis ist keine Ellipse, und eine Ellipse ist kein Kreis, zumindest gemäß der „ist ein“ Beziehung in der Vererbung. Unsere Lösung besteht darin, ein anderes Paradigma namens Mixins zu verwenden. Ich betrachte das als die „Dose“ -Beziehung. Lassen Sie mich Ihnen zeigen, was ich meine. Hier sind zwei Klassen, Person und Hund. Unter beiden Klassen habe ich ihre Methoden aufgelistet. Wir beginnen mit der Vererbung. Unsere natürliche Elternklasse ist lebendiges Ding, das Move und Grow standardmäßig definiert. Hier bedeutet der graue Text unter Person und Hund, dass diese beiden Klassen diese Methoden erben. Was ist jedoch, wenn wir eine Fahrzeugklasse hinzufügen? Ein Auto ist kein lebendiges Ding, aber es kann sich bewegen. Lassen Sie uns eine andere übergeordnete Klasse für Klassen erstellen, die sich bewegen können. Diese neue Klasse wird als beweglich bezeichnet, und sowohl Lebewesen als auch Auto erben davon. Großartig. Aber was wäre, wenn wir eine Pflanzenklasse hätten? Es ist ein Lebewesen, aber es bewegt sich nicht. Es gibt keine klare Hierarchie, wo das funktioniert. Anstatt also eine Hierarchie mit Vererbung zu erstellen, lassen Sie uns überlegen, was jede Klasse tun kann. Jede übergeordnete Klasse definiert stattdessen eine Eigenschaft des Objekts. Hier haben wir eine Elternklasse für alle Klassen, die wachsen können, genannt Growable, in rosa. Wir haben auch eine separate Klasse, genannt Movable, in blau. Jede übergeordnete Klasse definiert ein neues Verhalten, das die Unterklassen ausführen können. Eine Pflanze kann wachsen, eine Person kann sich bewegen und wachsen, und so weiter und so weiter. Zusammenfassend kann A B, wenn a die Fähigkeit B hat; zum Beispiel ist eine Person anwachsenbar, da eine Person wachsen kann. Der offizielle Name für diese fähigkeitsbasierten Klassen sind Mixins, die die Flexibilität Ihres Codes erheblich verbessern. Sie können eine beliebige Anzahl verschiedener Fähigkeiten für jede neue Klasse, die Sie definieren, mischen und abgleichen. Eine weitere Alternative zur „is a“ -Beziehung ist die Komposition, in der wir Objekte verschachteln, anstatt Objekte zu erben. Die Zusammensetzung wird durch „hat eine“ Beziehungen zusammengefasst, wie ein Auto Räder hat. Ich glaube, Komposition hat mehr Nuance als die meisten Online-Artikel decken, aber wir werden hier vorerst aufhören, weil ich das Gefühl habe, dass die Nuance mehr verwirrend als hilfreich sein wird. Wir werden die Nuance darüber, wie Komposition die Vererbung in einer späteren Klasse, Post oder Video ersetzt . Unser endgültiges Konzept in dieser Lektion ist Polymorphismus. Kurz gesagt, Polymorphismus ist, wenn mehrere Klassen alle die gleiche Schnittstelle implementieren. Mit anderen Worten, eine Reihe von Klassen alle erfüllen die gleichen Erwartungen. Zum Beispiel können wir mehrere Tierklassen implementieren, wie Affe und Hund, die alle Methoden wachsen und bewegen. Angenommen, Sie haben ein Stück Code, der nur auf den Wachstums- und Bewegungsmethoden beruht, dann ist das coole Ding, dass Sie diesen Code für jede Tierklasse ausführen können, die Sie haben. Das schließt unsere Konzepte für diese Lektion ab. Kurz gesagt, wir haben das Circle-Ellipse-Problem behandelt, um einen Fehler in „is a“ -Beziehungen zu enthüllen. Wir haben dann zwei alternative Arten von Beziehungen behandelt, „kann“ und „hat eine“ Beziehungen, um die Flexibilität Ihres Codes zu verbessern. Schließlich haben wir kurz einen Vorteil der objektorientierten Programmierung erörtert , nämlich Polymorphismus. Eine Kopie dieser Folien und weitere Ressourcen finden Sie auf der Kurs-Website. Damit wird unsere erweiterte Vererbung Lektion abgeschlossen, die Ihr objektorientiertes Programmierverständnis verbessert. Das war eine herausfordernde Lektion Wenn du also nicht ganz gefolgt bist, ist das okay. Die Tipps und Takeaways aus dieser Lektion werden sinnvoller, wenn Sie beginnen, objektorientierte Programmierung zu verwenden und selbst auf Designfehler zu stoßen. In der nächsten Lektion werden wir Mixins implementieren. 15. Übung: Schmelzende Eiscreme: In dieser Lektion implementieren wir Schmelzeis. Insbesondere werden wir Mixin Konzept verwenden, das wir gelernt haben um ein Schmelzeis zu schaffen, das wir essen und trinken können. Navigieren Sie zu der folgenden URL, um zu beginnen. Sobald Sie diese Seite sehen, verzweigen Sie das Projekt, um Ihre eigene editierbare Kopie zu erhalten. Klicken Sie dazu oben links auf den Projektnamen, um ein Dropdown-Menü zu erhalten. Klicken Sie auf die Auslassungspunkte, um eine weitere Dropdown-Liste zu erhalten, und klicken Sie schließlich auf die Schaltfläche Gabel. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Beginnen wir mit der Visualisierung des Ziels. Im Moment haben Sie nur einen Eiskurs. Unser Ziel ist es, sowohl Limonade als auch Schmelzeis hinzuzufügen. Wir wissen, dass das Schmelzen von Eis Unterklasse sein sollte. Im Geiste der Mixins fügen wir eine trinkbare Klasse hinzu, die die Möglichkeit für eine Klasse hinzufügt, getrunken zu werden. Hier können sowohl Limonade als auch Schmelzeis getrunken werden. Rot hervorgehoben sind die Klassen, die wir implementieren werden. Hier ist jedoch eine Sache zu beachten. Beachten Sie, dass Eis und trinkbar beide haben die Add-Methode. Wir müssen besonders vorsichtig sein, wenn Sie Mehrfachvererbung vom Schmelzeis verwenden. Das Schmelzen von Eis muss sowohl trinkbar als auch Eis unterklasse, aber dem Eis Vorrang geben. Sie erstellen diese Klassen jetzt nacheinander. Auf der rechten Seite sehen Sie den Code, den wir aus früheren Lektionen erhalten haben. Wir können die Eis-Klasse finden, indem wir nach unten scrollen. Wir können auch die Eiswagen Klasse und schließlich die Deluxe-Eiswagen Klasse finden. Ganz unten nach dieser Klasse, lassen Sie uns jetzt unsere Mixins hinzufügen. Wir werden unsere trinkbare Klasse schaffen. Legen Sie im Konstruktor die Anzahl der Tassen auf Null fest. Wir werden messen, wie viel von dem Getränk in Tassen übrig ist. Hier ist unser Konstruktor mit selbst als Argument, wir werden Tassen gleich Null definieren. Als nächstes erstellen Sie eine Add-Methode, die dem Getränk eine bestimmte Anzahl von Tassen hinzufügt. Sie haben def, die Add-Methode mit diesem Self-Argument, dann die Anzahl der Tassen hinzuzufügen. Dann erhöhen wir die Anzahl der Tassen um diesen Betrag. Erstellen Sie schließlich eine Getränkemethode, die eine bestimmte Anzahl von Tassen vom Getränk subtrahiert. Hier haben wir die Getränke-Methode, die eine bestimmte Anzahl von Tassen nimmt und diese Anzahl der Tassen von der Gesamtmenge abzieht. Gehen wir nun zurück zu den Folien. Zu Ihrer Referenz, hier ist das Diagramm für das, was wir aufbauen. Erstellen Sie nun die Limonadenklasse. Wieder, für Ihre Referenz, hier ist unser Diagramm. unter Ihrem vorhandenen Code Lassen Sie unsunter Ihrem vorhandenen Codeeine neue Limonadenklasse erstellen. Diese Limonade Klasse wird von trinkbaren erben. Diese Limonade Klasse wird trinkbar Unterklasse. Die Limonade Klasse erbt dann automatisch alle Add and Drink Methoden. Jetzt für das letzte Stück, werden Sie Schmelzeis implementieren. Wieder zu Ihrer Referenz, hier ist unser Diagramm. Erstellen Sie eine Klasse, schmelzende Eis, die sowohl von Eis als auch trinkbar erbt. Hier haben wir Schmelzeis, das sowohl von Eis als auch trinkbar erbt. Beachten Sie, dass die Bestellung wichtig ist. Indem wir zuerst Eis schreiben, erzwingen wir, dass die Add-Methode von Eis Vorrang vor trinkable Add-Methode hat. Wir fügen nun eine verstrichene Methode hinzu. Mit dieser Methode wird die Anzahl der Messlöffel von ungeschmolzenem Eis und Tassen geschmolzenem Eis im Laufe der Zeit aktualisiert . Diese Methode benötigt Zeit als Argument verstrichen. Hier schreiben wir verstrichen (selbst), die Menge der Zeit, die verstrichen ist, und berechnen zuerst die Anzahl der Eisportionen, die geschmolzen sind. Dies ist entweder die verstrichene Zeit oder die Anzahl der verbleibenden Schaufeln; je nachdem, was kleiner ist. Hier berechnen wir geschmolzen ist gleich dem Minimum von entweder einer verstrichenen Zeit oder der Anzahl der Kugeln übrig. Dann subtrahieren Sie die Anzahl der geschmolzenen Schaufeln von der Gesamtzahl der Messlöffel. Hier werden wir Kugeln minus gleich geschmolzen haben. Fügen Sie auch die Anzahl der geschmolzenen Messlöffel zu den Tassen geschmolzenes Eis hinzu. Hier haben wir Tassen plus gleich geschmolzen. Das rundet unsere geschmolzene Eis-Klasse ab. Die Methoden Add, Drink und Eat werden alle von den beiden Elternklassen geerbt. Jetzt verwenden Sie Ihre brandneue Schmelzeisklasse. Klicken Sie auf den grünen Pfeil oben, um Ihren Code auszuführen, instanziieren Sie dann Ihr Schmelzeis. Fügen Sie einige Messlöffel hinzu, und dann verstrichene Zeit, um zu sehen, wie viel geschmolzen ist. Hier schreiben wir ice_cream.elapse (2). Mal sehen, wie viele Schaufeln übrig sind. Wir erwarten, dass zwei Kugeln Eis schmelzen, so dass nur eine Kugel Eis übrig bleibt, und tatsächlich sehen wir eine. Jetzt sehen wir, wie viele Tassen geschmolzenes Eis übrig sind. Ice_cream.cups und wir erwarten zwei, genau wie unsere Ergebnisse sagen. Lass uns jetzt etwas geschmolzenes Eis trinken. Eiscreme.Trinken, und lassen Sie uns eine Tasse trinken. Lassen Sie uns jetzt überprüfen, wie viel geschmolzenes Eis übrig ist. Ice_cream.cups, wie erwartet, haben wir nur noch eine Tasse übrig. Das war's. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Dies schließt unsere geschmolzene Eispraxis ab. Weiter oben ist zusätzliche Bonuspraxis für Mixin. 16. (Bonus) Übung: Zeitgesteuerte Lichter: In dieser Lektion werden wir mehr über das Mixin-Vererbungskonzept mit Lichtschaltern üben . Insbesondere implementieren wir zeitgesteuerte Lichter, die sich nach einer bestimmten Zeit ausschalten. Navigieren Sie zu der folgenden URL, um zu beginnen. Sobald Sie diese Seite sehen, forken Sie das Projekt, um Ihre eigene essbare Kopie zu erhalten. Klicken Sie dazu oben links auf den Projektnamen, um ein Dropdown-Menü zu erhalten. Klicken Sie auf die „Ellipse“, um eine weitere Dropdown-Liste zu erhalten, und klicken Sie schließlich auf die Schaltfläche „Fork“. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Zuerst werden wir unseren Plan visualisieren. Wir haben schon ein Licht. Wir werden nun ein TimerLight erstellen, das sowohl einen Timer als auch ein Licht unterkauft. Beachten Sie, dass wir keine generische Geräteklasse erstellt haben, die all diese Fähigkeiten enthält. Wir stattdessen erstellt es separate Timer- und Lichtklassen, wobei jeder eine Fähigkeit wie ein Mixin darstellt. Rot hervorgehoben, sind die neuen Klassen, die wir erstellen müssen. Beginnen wir mit einer Timer-Klasse. Hier ist unser Diagramm dessen, was wir erschaffen. Nachdem Sie Ihren Code gegabelt haben, sollte Ihre rechte Seite mit meinem übereinstimmen. Wenn ich nach unten scrolle, sehen Sie die Lichtklasse, die wir in früheren Lektionen erstellt haben, sowie das alte Licht. Am Ende Ihrer Datei erstellen wir jetzt einen Timer. Hier haben wir Klassen-Timer. In unserem Konstruktor werden wir die verbleibende Zeit auf Null setzen. Definieren Sie Ihren Konstruktor, und innerhalb des Konstruktors definieren wir die verbleibende Zeit auf Null. Definieren Sie dann eine festgelegte Methode, mit der Sie den Timer starten können. Wir definieren Set, die in einem Argument mit, wie viel Zeit noch. Hier setzen wir eine Zeit auf die angeforderte Zeit. Wir definieren dann einen Methodenring, der klingelt, wenn die Zeit abgelaufen ist. Wir definieren Ring, der keine zusätzlichen Argumente benötigt und drucken wird: „Timer ist auf.“ Schließlich definieren wir eine verstrichene Methode, die den Timer für einige Zeit verläuft. Hier haben wir verstrichen definiert, die in sich selbst als erstes Argument und dann die verstrichene Zeit nimmt. Überprüfen Sie zuerst, ob im Timer noch Zeit übrig ist. Wenn self.left größer als Null ist, subtrahieren Sie die verbleibende Zeit. Hier haben wir die übrige Zeit ist gleich der Zeit minus der verstrichenen Zeit. Wir müssen jedoch sicherstellen, dass diese Menge nicht negativ ist. Mit anderen Worten, wenn die verstrichene Zeit größer als die verbleibende Zeit ist, könnte sie negativ sein. Lassen Sie uns hier schreiben, max mit Null, und dies stellt sicher, dass die verbleibende Zeit immer nicht negativ ist. Schließlich, wenn im Timer keine Zeit mehr übrig ist, dann sollten wir klingeln. Wenn self.left gleich Null ist, dann sollten wir unsere Ringmethode aufrufen. Jetzt sollten wir unsere TimerLight-Klasse schreiben. Zurück in Ihrem Code werden wir eine TimerLight-Klasse erstellen. Hier haben wir TimerLight, das sowohl vom Licht als auch vom Timer erbt. Das erste, was wir tun werden, hier ist unser Diagramm dessen, was wir erschaffen. Erstellen Sie Ihre TimerLight-Klasse und Unterklasse sowohl Licht als auch Timer. Hier haben wir TimerLight, mit Unterklassen sowohl Licht als auch Timer. Unser erster Schritt besteht darin, die set-Methode zu überschreiben. Definieren Sie Set, die in der verbleibenden Zeit dauert. Die erste Lektion hier besteht darin, Abstraktionsbarrieren zu respektieren. Wir rufen die übergeordneten Klassen, set-Methode. Wenn noch Zeit bleibt, schalten Sie das Licht ein. Wenn self.left größer als Null ist, sollten wir das Licht automatisch einschalten. Wir sollten auch die Ringmethode überschreiben. Hier definieren wir Ring, keine zusätzlichen Argumente enthält, rufen Sie Ihre übergeordnete Ringmethode auf, damit wir den Timer klingeln und dann das Licht ausschalten können , da der Timer nur klingelt, wenn die Zeit abgelaufen ist. Damit ist unser TimerLight abgeschlossen. Schließlich werden wir unsere TimerLight-Klasse verwenden. Klicken Sie auf die grüne Schaltfläche oben, um Ihren Code auszuführen, instanziieren Sie dann Ihren Timer. Hier starten wir die Uhr mit fünf Sekunden. Der Timer ist eingestellt, fünf. Dann lassen Sie uns drei Sekunden vergehen. Kein Klingeln sollte auftreten und keiner tut es. Dann müssen wir noch drei Sekunden vergehen. Dieses Mal sollte es klingeln. Darüber hinaus sollte die verbleibende Zeit Null sein. Lassen Sie uns überprüfen timer.left ist in der Tat Null und nicht negativ. Als nächstes schauen wir uns unser TimerLight an. Ich werde auf diesen X-Button klicken, um meine Ausgabe zu löschen. Instanziieren Sie jetzt Ihre Timer-Klasse. Timer_light entspricht TimerLight. Tun Sie genau das Gleiche. Starten Sie die Uhr mit fünf Sekunden, timer_light Punkt mit fünf gesetzt. Das Zeitlicht sollte nun eingeschaltet sein. Lassen Sie uns überprüfen, timer_light dot is_on, und in der Tat ist das Licht an. Wir sollten dann drei Sekunden vergehen. Timer_Lichtpunkt ist verstrichen (3). Das Licht sollte immer noch an sein, also lasst uns nochmals überprüfen. Timer_Lichtpunkt is_on, ist true. Lassen Sie uns noch drei Sekunden vergehen. Wir erwarten einen Ring und das Licht schaltet sich aus. Timer_Lichtpunkt verstrichen, drei Sekunden, dieser Timer ist aktiviert. Das ist unser Ring, und lassen Sie uns überprüfen, ob das Licht an ist oder nicht. Timer_Lichtpunkt ist_on. Da gehen wir. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Das schließt unsere Timer-Lichtpraxis ab. Weiter oben, ist ein weiterer mysteriöser Fehler im Zusammenhang mit der Vererbung, die Sie begegnen können. Mal sehen, was dieser mysteriöse Fehler ist und wie man damit umgeht. 17. (Bonus) Rätsel: Fragile Base Class-Problem: In dieser Lektion werden wir das Phänomen Fragile Base Class untersuchen. Dieser Fremde verursacht und wie man dies umgeht. Navigieren Sie wie zuvor zu repl.it/languages/python3. Dann schlage ich vor, Ihre Skillshare und repl.it Fenster nebeneinander zu platzieren, wie hier gezeigt. Lassen Sie mich zuerst den Fehler vorstellen. Lassen Sie uns eine Klasse A definieren. Innerhalb dieser Klasse definieren wir eine Methode hi, die Hallo druckt, und drucken hi. Definiert dann eine Methode hallo, die auch hallo druckt. Definiert dann eine Klasse B, die Unterklassen A. Wir überschreiben dann die Methode hi stattdessen Hallo aufzurufen. Jetzt wird dies selbst keine Probleme verursachen. Lass uns voran gehen und sehen, wie man diese benutzt. Wir werden „Run“ ganz oben treffen. Dann instanziieren Sie Klasse B. Wir rufen b.hi und keine Probleme. Lassen Sie uns jetzt das Problem in Klasse A erstellen Sagen wir, dass wir das Redundanzproblem bemerkt haben. Methode hi und hallo tun genau das gleiche, also entscheiden wir uns, die Methode hallo einfach eine Methode aufrufen hi. Lassen Sie uns die Methode hallo aktualisieren, um einfach hi aufzurufen. Versuchen wir es jetzt noch einmal. Wir werden den grünen Pfeil oben drücken, um Ihre Datei auszuführen, dann geben wir b gleich B ist zu instanziieren, dann rufen wir b.hi und wow. Wir haben diesen Rekursionsfehler erhalten, maximale Rekursionstiefe überschritten. Was ist passiert? Nun, Klasse B erbt die Methode hallo, die hi aufruft. Klasse B überschreibt auch die Methode hi, hallo aufzurufen, also ruft hallo und hallo hallo hallo auf. Diese beiden Methoden, hallo und hallo, rufen sich unendlich an und der Fehler unten hier, die maximale Rekursionstiefe überschritten, bedeutet, dass der Code eine Bajillion Mal ausgeführt wurde, bis der Computer damit nicht mehr umgehen konnte. Die Lösung ist in diesem Fall einfach, definieren Sie einfach nicht hallo neu, um hi zu nennen. In einem komplexeren System wird dies jedoch schwer zu prüfen und durchzusetzen. Leider gibt es in Python keine guten eingebauten Lösungen dafür. Aber in anderen Sprachen besteht eine Lösung darin, Methoden als endgültig zu markieren und nicht zu überschreiben. In diesem Fall hätten wir die Methode hi als endgültig markieren können. Eine Kopie dieser Folien und der fertige Code für diese Lektion Sie auf der Kurs-Website. Dies schließt das Geheimnis der Fragile Basisklasse und deren Vererbung plus Abschnitt. In der Tat haben wir alle neuen Inhalte für den Kurs fertig gestellt. In der nächsten Lektion fassen wir Ihre Takeaways zusammen, einige nächste Schritte vor und beschreiben Bonusinhalte. In der nächsten Lektion werden wir Ihre Takeaways zusammenfassen und einige weitere Schritte erstellen. Herzlichen Glückwunsch dazu, es so weit zu machen. Das war kein einfacher Kurs, und Sie haben gut gemacht. 18. Schlussbemerkung: Herzlichen Glückwunsch zum Aufbau Ihrer allerersten Simulation mit objektorientierter Programmierung. Wir haben eine große Anzahl von Konzepten abgedeckt. Konzepte wie Klassen, Instanzen, zu allgemeinen Paradigmen wie Abstraktion. Das ist eine Menge Material. Aber keine Sorge, Sie können die Syntax immer neu nachsehen, wenn Sie sie vergessen. Wichtigste zum Mitnehmen, was man nicht einfach nachschlagen kann , ist das objektorientierte Programmierparadigma. Wie man Entitäten in der Welt um Sie herum als eine Reihe von Objekten denkt , die miteinander interagieren. Wie man Abstraktion für Lesbarkeit, Vererbung für Wartbarkeit und Mischungen oder Komposition für Flexibilität verwendet. Wenn du diese spezifischen Begriffe vergisst, ist das okay. Wenn Sie jedoch unflexiblen, nicht wartbaren oder unlesbaren Code schreiben, dann kann es sich lohnen, einige dieser Lektionen tatsächlich zu überarbeiten um die Intuition wiederzuerlangen und diese Ideen zu praktizieren. Ich schlage vor, eine brandneue Funktion zu Ihrer Simulation hinzuzufügen, vielleicht Wüsten, andere Wüsten hinzuzufügen, Eiswagen zu machen, dann verlinken Sie Ihr Projekt auf der Registerkarte Projekte und Ressourcen und teilen Sie es. Ich kann es kaum erwarten, einen Blick zu werfen. Jetzt, da Sie OOP gerade gelernt haben, haben Sie wahrscheinlich eine andere und sehr einzigartige Möglichkeit Ihre Takeaways aus diesem Kurs zu erklären. Wenn Sie das im Sinn haben, zögern Sie nicht, im Diskussionsteil des Skillshare Kurses zu posten. Wenn dies Ihr Interesse geweckt hat und Sie ein wenig mehr lernen möchten, gibt es ein paar nächste Schritte. Schauen Sie sich die zusätzlichen Ressourcen unter alvinwan.com/oop101 an. Mastering OOP ist einzigartig und Sie brauchen nicht die richtigen Antworten. Üben Sie stattdessen einfach, sehr komplexe Systeme in OOP zu entwerfen. Dein Aha-Moment wird kommen, wenn zwei Bedingungen erfüllt sind. Zuerst erkennen Sie, dass Ihr Code schwer zu lesen oder schwer zu pflegen ist. Zweitens besuchen Sie diesen Kurs erneut, wenden diese Tipps an und erkennen, wie es Ihren Code leicht skalierbar, einfach zu erweitern oder einfach zu lesen macht . Sicher, es ist immer noch sanfte Entdeckung, aber anstatt 100 verschiedene Wege auszuprobieren, habe ich Ihnen einfach die richtige Antwort übergeben, die Genies vor mir gefunden haben. Um mehr Codierung über OOP zu erfahren, können Sie versuchen, My Computer Vision 101 Klasse in Computer Vision, MySQL 101 Klasse, um Design-Datenbanken zu starten, oder meine Data Science 101 Klasse, um mit Daten zu spielen zu beginnen. Ich habe diesen Kurs auch so konzipiert, dass er in sich geschlossen und relativ kurz ist. Es gibt mehr Inhalte, die Ihnen helfen, Codierungsinterviews zu unterstützen und zu einem fortgeschrittenen Python Entwickler zu werden. Wenn das interessant klingt, gehen Sie zu meinem Skillshare Profil und klicken Sie auf Folgen, um benachrichtigt zu werden, wenn die nächste Klasse gestartet wird. Herzlichen Glückwunsch noch einmal dazu, es ganz am Ende des Kurses zu machen, und bis zum nächsten Mal.