JPO : Webinar d'information sur nos formations → RDV mardi à 17h30.

Objektorientierte Programmierung (OOP): Der ultimative Leitfaden

In diesem Artikel werden wir die objektorientierte Programmierung (OOP), ihre wichtigsten Prinzipien und Besonderheiten und ihre Verwendung in Python definieren. Dieses Konzept ist sehr wichtig und zugänglich sowohl für Data Scientists als auch für Data Engineers.

Die Programmiersprache Python ist eine sehr zugängliche Sprache, um mit dem Programmieren zu beginnen. Mit ihren Bibliotheken Numpy, Pandas, Sklearn und Matplotlib ist sie auch ein großartiges Werkzeug für Datenwissenschaftlerinnen und Datenwissenschaftler.

Man kann mit Python sehr leicht programmieren da das Programm zahlreiche Paradigmen enthält: Die imperative Programmierung mit funktionalem Paradigma oder die objektorientierte Programmierung mit OOP-Paradigma.

1. Einführung in die objektorientierte Programmierung

In diesem Teil werden wir Klassen, Instanzen, Methoden und Attribute ansprechen. Auch wenn diese Begriffe für Junior Data Scientists unklar klingen mögen, werden diese Konzepte in Python dennoch ständig manipuliert, vor allem mit den zuvor erwähnten Bibliotheken.

Dieses Paradigma ist auch in anderen Programmiersprachen sehr präsent, sei es vollständig (Java oder C#) oder teilweise (C++, Ruby, Scala, …).

Nach der Umfrage von Stack Overflow zu den verwendeten Technologien werden Java und C# von 41 bzw. 31 % der befragten Entwicklerinnen und Entwickler verwendet.

Python kann also ein erster Zugang zu diesen häufig verwendeten Sprachen sein.

Es ist daher wichtig, dieses Paradigma zu beherrschen, da es in Tools wie Spark oder Hadoop auch zu finden ist.

programmation orientee objet
Mit der objektorientierten Programmierung kann man sich viele Werkzeuge

Wenn Du die objektorientierte Programmierung mit Python beherrschst, ist es also ein wertvoller Vorteil, um Dich später mit häufig genutzten Werkzeugen auseinanderzusetzen, sowohl in der Data Science als auch in der Big Data.

Schließlich ist die objektorientierte Programmierung ein unglaubliches Werkzeug, um die Qualität, die Lesbarkeit und die Modularität Deines Codes zu verbessern. Mit dem Konzept der Vererbung kannst Du insbesondere die Anpassung von Inhalten, die von anderen erstellt wurden, vereinfachen.

Beispielsweise konnten wir im Rahmen unserer Weiterbildungen Tools erstellen, die sich wie Python-Datenbank-Clients verhielten, tatsächlich aber Docker-Images dieser Datenbanken starteten und mit ihnen kommunizierten.

Auch die Anpassung von Machine-Learning-Modellen ist dank der objektorientierten Programmierung sehr einfach zu bewerkstelligen.

2. Das Konzept der Klasse

Der wichtigste Begriff in der objektorientierten Programmierung ist das Konzept der Klassen. Klassen sind abstrakte Modelle, also Vorlagen, mit deren Hilfe Objekte seriell nach demselben Muster erstellt werden können. Man kann sich eine Klasse als Bauplan sowie als Liste der Funktionalitäten einer Menge von Objekten vorstellen.

programmation orientée objet
Mit dem Definieren einer Klasse kann man reihenweise identische Objekte erstellen.

Bei der objektorientierten Programmierung hat man nur mit Klassen und Objekten (oder Klasseninstanzen) zu tun. Alle Elemente, die bei der objektorientierten Programmierung manipuliert werden, sind Objekte (daher der Name), deren Konstruktion auf der Definition einer Klasse beruht.

a) Wie erstellt man eine Klasse mit Python?

Mithilfe dieses Modells können wir dann Objekte, sogenannte Instanzen erstellen. Um in Python Klassen zu erstellen, verwenden wir das Schlüsselwort class.

Im Beispiel erstellen wir eine Klasse namens Animal. Damit wählen wir das Modell aus, das die verschiedenen Instanzen der Klasse Animal haben werden. Im Moment ist diese Klasse noch sehr einfach, aber wir werden sie später noch komplexer gestalten.

Um diese Klasse zu instanziieren, rufen wir die Klasse Animal auf, als ob sie eine Funktion wäre:

Hier haben wir zwei Objekte und zwei Instanzen der Klasse Animal, erstellt: animal1 und animal2. Wenn wir den Typ dieser beiden Objekte mit der Funktion type anzeigen, sehen wir, dass beide Objekte der Klasse Animal angehören.

python classe
Nicht verwechseln: Python als ein klasse Animal definieren und eine Klasse „Animal” in Python definieren.

b) Konstruktoren

Konstruktoren sind sehr wichtige Funktionen (nicht genau, aber zunächst benutzen wir dieses Wort). Es sind die Funktionen, die aufgerufen werden, wenn ein Objekt erstellt wird. Im ersten Fall den wir gezeigt haben, hatten wir nichts Besonderes zu konstruieren, also haben wir den Konstruktor nicht definiert.

In den meisten Fällen müssen wir ihn jedoch definieren. Wenn wir eine Benachrichtigung hinzufügen wollen die uns darauf hinweist, dass ein Objekt der Klasse Animal erstellt wurde, definieren wir die Funktion _ _init_ _ wie folgt:

Diese Funktion _ _init_ _ hat ein sehr wichtiges Argument: self. Dieses Schlüsselwort bezeichnet das Objekt selbst. Im Moment ist diese Verwendung noch etwas verwirrend, aber wir werden später sehen, warum dieses Wort so wichtig ist.

c) Die Attribute

Unsere Klasse ist im Moment nicht sehr interessant… Wir müssen unseren Animals Eigenschaften hinzufügen, um sie interessant zu machen.

Diese Eigenschaften werden Attribute genannt.

Wir werden zum Beispiel allen unseren Objekten in der Klasse Animal ein Alter geben:

In die Funktion _ _init_ _ wurde die Definition einer Variablen self.age eingefügt, die den Wert 0 hat.

Mit der Definition self.<irgendwas> legt man nämlich ein Attribut der Objekte der Klasse fest.

So haben alle Instanzen der Klasse Tier ein Attribut age, das bei der Erstellung des Objekts den Wert 0 hat.

Um auf die Attribute eines Objekts zuzugreifen, verwendet man einen Punkt. So wird in diesem Beispiel auf die Attribute age von animal1 und animal2 zugegriffen.

Attribute sind also wie die Eigenschaften von Objekten einer Klasse zu sehen: Alle Objekte, die aus dieser Klasse erstellt werden und die diese Klasse instanziieren, besitzen dieselben Eigenschaften.

Wenn sie in der Funktion _ _init_ _ definiert werden, haben alle Instanzen dieser Klasse diese Eigenschaften.

Man kann problemlos diese Werte ändern, ihnen Objekt für Objekt einen völlig anderen Wert geben, aber sie werden auf die gleiche Weise initialisiert:

classe_poo
classe_poo
classe_poo

Unterschiedliche Vorstellungen von einer Klasse

In diesem Teil haben wir gesehen, dass Klassen Vorlagen für Objekte sind. Diese Vorlagen können Eigenschaften haben, die durch Attribute dargestellt werden. Schließlich werden diese Objekte oder Instanzen einer Klasse mithilfe einer speziellen „Funktion”, nämlich dem Konstruktor, erstellt.

Es gibt noch einige Themen, die wir noch definieren müssen, damit Du zum echten OOP-Assen wirst …

3. Die Methoden

Im vorherigen Teil haben wir die Attribute definiert, d.h. die Eigenschaften eines Objekts einer Klasse.

Kurze Erinnerung: Wenn die verwendete Klasse „Bürger“ ist, können die Attribute der Instanzen dieser Klasse „Nachname“, „Vorname“, „Geschlecht“, „Geburtsdatum“, „Geburtsort“, „Ausweis“, „Unterschrift“ und „Größe“ sein.

Das Definieren einer Klasse „Bürger” wäre also wie das Definieren einer Vorlage für einen leeren Personalausweis.

a) Methoden vs. Funktionen

Funktionen und Methoden können Eingaben aufnehmen und Ausgaben zurückgeben, jedoch sind Funktionen nicht objektbezogen. In der Tat gibt es in der reinen objektorientierten Programmierung keine Funktionen, da alles ein Objekt, d. h. eine Instanz einer Klasse ist.

methode
Ein anderer bekannter Artikel über die Methode.

Mit einer Methode kann man Operationen durchführen die für ein Objekt spezifisch sind: Attribute ändern, anzeigen, zurückgeben (oder im Fall der Methode _ _init_ _ initialisieren).

b) Wie man eine Methode erstellt

Kehren wir zu unserem Beispiel der Klasse Animal zurück, für die wir das Attribut age definiert haben. Mit der Methode _ _init_ _ wird das Attribut age auf 0 initialisiert. Wir können nun eine Methode „altern“ erstellen, die dem Attribut age den Wert 1 hinzufügt:

Wenn man sich die Definition dieser Methode genauer ansieht, fällt die Verwendung des Schlüsselworts def auf, das normalerweise die Definition einer Funktion einleitet. Diese Deklaration der Methode ist jedoch so eingelegt, dass sie sich innerhalb der Klassendefinition befindet.

Außerdem fällt auf, dass das Argument self noch verwendet wird. Wir werden später sehen, dass es nicht immer notwendig ist, dieses Argument zu verwenden. Dank dieser Definition haben also alle Objekte die Instanzen dieser Klasse Animal sind die Möglichkeit, diese Methode aufzurufen:

Um eine Instanzmethode aufzurufen, verwendet man einen Punkt: Da es sich um eine Art Funktion handelt, verwendet man Klammern. Die Definition einer Methode funktioniert übrigens genauso wie die einer Funktion, in Bezug auf Argumente, Ausgaben usw.

So können wir zusätzliche Argumente für self verwenden.

Wenn wir zum Beispiel unseren Animals einen Namen geben wollen, können wir in der Methode _ _init_ _ ein Attribut „name“ eingeben und eine Methode „name“ erstellen, mit der wir den Wert des Attributs „name“ ändern können:

Die Eingabe von Argumenten in einer Methode ist natürlich sehr einfach:

c) Meilenstein

Bisher haben wir das Konzept der Klasse und der Klasseninstanz erläutert. Außerdem haben wir Attribute und Methoden definiert. Dies ist der Kern der objektorientierten Programmierung. Wir könnten damit fast aufhören. Was wir später mithilfe dieser Werkzeuge tun würden, wäre einfache OOP, ohne die Vorteile aller OOP-Konzepte zu nutzen (Das wäre zu schade …).

Vergessen wir nicht, dass die objektorientierte Programmierung auf dem Konzept der Modellierung beruht, das in der Technik (sei es Softwaretechnik, Data Science, Statistik, …) von entscheidender Bedeutung ist.

Man entscheidet sich dafür, sich einem realen Objekt durch eine Modellierung des Objekts zu nähern, auch wenn diese unvollkommen, aber möglichst funktional ist.

Versuchen wir nun konkret zu verstehen, warum das, was wir hier erklären, wichtig ist: Als Du mit dem Machine Learning mit scikit-learn begonnen hast, haben wir Dir sehr schnell von der logistischen Regression und ihrer Anwendung erzählt. Aber schauen wir uns die (vereinfachte) Implementierung dieser logistischen Regression in der scikit-learn-Bibliothek an.

STARTE DEINE KARRIERE
IM BEREICH DATA SCIENCE

Du bist an einem Quereinstieg in den Bereich Big Data interessiert, weißt aber nicht, wo Du anfangen sollst? Dann solltest Du einen Blick auf unsere Weiterbildungen im Bereich Data Science werfen.

STARTE DEINE KARRIERE
IM BEREICH DATA SCIENCE

Du bist an einem Quereinstieg in den Bereich Big Data interessiert, weißt aber nicht, wo Du anfangen sollst? 

Dann solltest Du einen Blick auf unsere Weiterbildungen im Bereich Data Science werfen.

Wir stellen fest, dass LogisticRegression eine Klasse ist. Sie hat eine Methode _ _init_ _, die verschiedene Argumente haben kann. Sie hat auch andere Methoden: fit, predict, predict_proba, … Sie hat Attribute: random_state, verbose, n_jobs, …

Mit einem klassischen Code von Data Scientists können wir also von objektorientierter Programmierung sprechen:

Objektorientierte Programmierung ist also für Data Scientists von entscheidender Bedeutung!

In diesem Teil haben wir gesehen, dass Methoden eigene Funktionen für Instanzen einer Klasse sind und wie man sie mit Python definiert und aufruft. Im Folgenden werden wir über bestimmte Methoden sprechen, nämlich über Accessoren und Mutatoren. Damit werde wir ein wichtiges Konzept der objektorientierten Programmierung erläutern: die Kapselung.

4. Die Kapselung

a) Getters und Setters

Getters sind Methoden, mit denen der Wert eines Attributs zurückgegeben werden kann.

Mit Setters kann man den Wert eines Attributs ändern.

Aber warum sollte man diese Methoden verwenden, wenn man die Attribute, wie oben beschrieben, einfach ändern oder lesen kann?

Die Verwendung dieser Methoden ist Teil des Konzepts der Kapselung: Man möchte den Schreib- oder Lesezugriff auf Attribute kontrollieren. Beispielsweise möchte ich den Typen oder den Wert kontrollieren, der einem Attribut zugewiesen werden kann. Durch die Verwendung eines Setters verberge ich die Änderung des Werts vor einem Benutzer, indem ich den Benutzer diese Methode verwenden lasse, welche dann meine Änderungsbedingungen enthalten kann.

b) Kapselung von Attributen

In der objektorientierten Programmierung werden unterschiedliche Arten von Attributen unterschieden: öffentliche Attribute, geschützte Attribute und private Attribute. Auf die geschützten Attribute werden wir im Zusammenhang mit der Vererbung noch zurückkommen, aber der wichtigste Unterschied ist der zwischen privaten und öffentlichen Attributen.

Auf ein privates Attribut kann nur innerhalb der Klassendefinition zugegriffen werden: Ich kann nur in der Definition der verschiedenen Methoden auf das Attribut zugreifen (Schreib- oder Lesezugriff ). Im Gegensatz dazu sind öffentliche Attribute immer und überall zugänglich.

Bisher haben wir nur mit öffentlichen Attributen gearbeitet.

In einer Sprache wie Java ist dieser Unterschied sehr strikt. Bei der Verwendung von Python wird ein Attribut nie vollständig privat gemacht: Python ist eine viel offenere Sprache: Man vertraut dem Endbenutzer, dass er nicht versucht, den Code zu zerstören.

Aber es gibt trotzdem Möglichkeiten, die Attribute weniger zugänglich zu machen.

c) Private Attribute in Python

Die Definition unserer Klasse ändern wir so, um ein privates Attribut age zu erstellen (warum sollte man schließlich das Recht haben, ein Animal, das man nicht kennt, nach seinem Alter zu fragen?).

Um ein privates Attribut zu definieren, benennen wir es mit _ _, aber Vorsicht! Wenn Du den Namen des Attributs ebenfalls mit _ _ beendest, wird es nicht mehr als privat betrachtet, sondern erhält lediglich einen komplizierteren Namen.

Die letzte Zeile sollte eine AttributeError-Ausnahme erzeugen: Das Attribut _ _age existiert nicht… Aber wir sehen, dass die Methode age“ gut funktioniert hat: Das Attribut _ _age existiert innerhalb der Definition der Methode.

Wir haben also ein privates Attribut erstellt … oder es ist einfach nur versteckt. Tatsächlich ist es vorhanden, aber unter einem anderen Namen: _Animal_ _age.

In anderen Programmiersprachen spielen hier Getters und Setters eine sehr wichtige Rolle, da wir mit ihrer Hilfe diese Attribute lesen oder ändern können.

Wir können sie aber auch selbst definieren:

In diesem Beispiel dienen die Methoden get_age und set_age als Akzessor und Mutator. Man sieht, wie nützlich ein Mutator ist, um den Typen eines Attributs zu kontrollieren. Dies ist für eine dynamisch typisierte Sprache wie Python von Vorteil.

d) Getters und Setters fehlerlos definieren

In diesem Teil werden wir Decorators verwenden. Wenn Du nicht weißt, was Decorators sind, solltest Du zuerst diesen Artikel lesen !

Um den Zugriff auf Attribute über Getter und Setter zu erzwingen, können wir die vorkonstruierte Klasse property verwenden:

Mit der ersten Definition der Methode age wird der Getter definiert, mit der zweiten Definition der Setter. In den folgenden Zeilen merkst Du, dass diese Methoden aufgerufen werden, wenn Du diese Attribute änderst oder aufrufst.

Achtung: In diesem Code ist das Attribut age immer öffentlich. Dieser Code soll lediglich zeigen, wie man Getter und Setter fehlerlos und einfach definieren kann.

Wer mutig ist, kann auf dieser Seite entdecken, wie diese Methoden in Bibliotheken wie pandas oder scikit-learn verwendet werden.

e) Kapselung von Methoden

Dasselbe Prinzip der Kapselung gilt auch für Methoden: Man kann private, geschützte oder öffentliche Methoden definieren. Auf öffentliche Methoden kann immer zugegriffen werden, während auf private Methoden nur innerhalb der Klasse zugegriffen werden kann.

Das Prinzip in Python ist das gleiche: Man verwendet _ _ am Anfang des Methodennamens (und nicht am Ende) und die Methode ist immer nach dem Muster _Klassenname_ _Methodenname auffindbar.

In diesem Teil haben wir das Prinzip der Kapselung verstanden, um Attribute und Methoden außerhalb der Klasse zu verbergen. Auf diese Weise kann der Zugriff auf Attribute und Methoden kontrolliert werden, z. B. mit Hilfe von Getters und Setters.

Jedoch handelt es sich hierbei um Konzepte der „reinen” objektorientierten Programmierung. Python hält sich nicht wirklich an diese Prinzipien, da man immer noch Zugriff auf private Attribute oder Methoden haben kann. In einer wirklich objektorientierten Sprache wie Java kann man nicht schummeln.

5. Die Vererbung

a) Das Konzept der Vererbung

Die Vererbung in der objektorientierten Programmierung ermöglicht es, ähnliche Klassen aus einer anderen Klasse einfach zu erstellen. Es heißt: Eine abgeleitete Klasse erbt von einer Basisklasse. In unserem Beispiel der Klasse Animal können die Klassen Reptil, Säugetier oder Vogel von der Klasse Animal erben: Wir bauen weiterhin Klassen und damit Modelle für Objekte auf, aber diese abgeleiteten Klassen haben die Attribute und Methoden der Basisklasse und spezifische Attribute und Methoden für diese abgeleiteten Klassen.

In unserem Beispiel hatte die Klasse Animal ein Attribut age und ein Attribut name, eine Methode name und eine Methode age werden. Die abgeleiteten Klassen der Klasse Animal haben dieselben Methoden und Attribute, können aber auch andere haben.

Ähnlich wie in der Biologie kann man den Aufbau von Vererbungsbeziehungen zwischen Klassen mit dem Aufbau eines phylogenetischen Baums vergleichen.

heritage poo
So ein Baum stellt die evolutionären Verbindungen zwischen verschiedenen Gruppen von Lebewesen dar (übrigens sind wir im rosa Bereich).

Durch Vererbung kann das Schreiben von Code erheblich vereinfacht werden: Stell Dir vor, Du entwickelst eine App für eine Schule. Du musst Benutzerinnen und Benutzer mit sehr ähnlichen Informationen (Name, Vorname, Geburtsdatum) modellieren. Aber einige Benutzerinnen und Benutzer werden spezifischere Aktionen durchführen. Du kannst also eine Klasse Benutzer erstellen und dann zwei Klassen erben: Schüler und Personal. Von der Klasse Personal können sogar die Klassen Lehrer, Assistent, Dokumentalist usw. geerbt werden. So muss die gesamte Arbeit für jede neue Klasse nicht erneut durchgeführt werden.

b) Vererbung mit Python

Wir wollen versuchen, eine Klasse Reptil zu definieren, die von der Klasse Animal erbt. Dazu deklarieren wir eine Klasse Reptile und geben direkt nach dem Namen der abgeleiteten Klasse den Namen der Basisklasse in Klammern an.

In diesem Beispiel sehen wir, dass das Objekt Reptil eine Instanz der Klasse Reptil ist, aber die Methoden und Attribute der Klasse Animal beibehalten hat, ohne dass sie neu definiert werden müssen: Das ist der Vorteil von der Vererbung.

c) Polymorphismus

Jedoch möchtest Du nur, dass eine Methode in einer abgeleiteten Klasse nicht das gleiche Verhalten hat wie ihre Entsprechung in der Basisklasse. Dann implementierst Du die Methode in der abgeleiteten Klasse einfach neu. Dies wird als Polymorphismus bezeichnet und ist eine Methode, die auch als Overriding bezeichnet wird.

Vorsicht! Polymorphismus kann zwei verschiedene Dinge bedeuten: Die Definition unterschiedlicher Methoden für Klassen, die voneinander erben (Overriding), aber auch die mehrfache Definition derselben Methode (oder Funktion) mit unterschiedlichen Argumenten (Overloading). Der zweite Fall ist natürlicher in statisch typisierten Programmiersprachen (Java, C++, …) und ist ziemlich weit von der Philosophie von Python entfernt. Wir werden ihn daher hier nicht näher erläutern.

Möchtest Du über Datentypen in Python mehr erfahren? Du findest alles in diesem Artikel.

Versuchen wir, die Methode name aus dem vorherigen Beispiel zu überladen:

In diesem Beispiel haben wir nur eine Zeile in die Methode name eingefügt, aber die Methode tut tatsächlich das Gleiche.

Versuchen wir nun, die Methode _ _init_ _ zu überladen, um ihr neue Attribute zu geben. Das Problem ist, dass die Anweisungen, die in der Methode _ _init_ _ der Klasse Animal gegeben werden, immer noch korrekt sind. Wir müssen hier nicht alles neu codieren, nur um ein Attribut hinzuzufügen! Tatsächlich können wir die Methode der Basisklasse aufrufen, indem wir das Schlüsselwort super verwenden.

Bei der Instanziierung wird die Methode _ _init_ _ der Klasse Animal aufgerufen und dann einige Anweisungen hinzugefügt, die spezifisch für die Klasse Reptile sind.

Außerdem können Methodenaufrufe der Basisklasse mit dem Schlüsselwort super verknüpft werden.

d) Mehrfachvererbung

Bisher haben wir die Vererbung im Fall einer Basisklasse und mehrerer abgeleitete Klassen gesehen. Man kann aber auch mehrere Basisklassen für eine abgeleitete Klasse haben.

Aber warum sollte man eine Klasse von mehreren Basisklassen erben? Auch hier geht es um die Einfachheit des Codes: Wenn eine Klasse bestimmte Funktionen enthält (z. B. Authentifizierung) und eine andere Klasse andere Funktionen (z. B. Machine-Learning-Modell), dann kann man die Eigenschaften beider Klassen für eine abgeleitete Klasse haben: Ein Firmenwagen ist z. B. ein Fahrzeug mit den Eigenschaften eines Fahrzeugs, aber auch eine Besitzung des Unternehmens mit seinem eigenen Eigenschaften. 

Achtung!

In Java zum Beispiel kann eine Klasse nicht von mehreren Basisklassen (auf derselben Ebene) erben. Man verwendet daher ein anderes Werkzeug, die Schnittstellen (interfaces), die diese Mehrfachvererbung ermöglichen. Man sagt jedoch, dass die abgeleiteten Klasse eine Schnittstelle implementiert. In Python ist das egal.

Viele dieser Beispiele findet man im Modul sklearn. Da es mehrere Basisklassen gibt, genügt es, sie alle zu melden.

Wenn Du dieses Beispiel jedoch laufen lässt, wirst Du sehen, dass die Instanzierung von B nicht übertragen wird… Die Funktion super berücksichtigt nur die erste Basisklasse. Glücklicherweise gibt es eine andere Methode, um die Methode der Basisklasse aufzurufen:

Mit dieser anderen Methode kann man sicher sein, auf welche Basismethode verwiesen wird. Hier haben wir für jede Klasse unterschiedliche Attribute hinzugefügt, um zu überprüfen, ob die Instanziierung korrekt erfolgt. Was passiert aber, wenn Attribute denselben Namen haben? Im Grunde hängt alles einfach davon ab, in welcher Reihenfolge man die Methoden der Basisklassen aufruft.

e) Geschützte Attribute und Methoden

Wir haben bereits viel über dieses Konzept der Vererbung erläutert. Wir wollen hier nur kurz auf den vorherigen Teil eingehen: Wir haben private Attribute erwähnt, die nur innerhalb der Klassendefinition zugänglich sind, und öffentliche Attribute, die überall zugänglich sind. Das Konzept der geschützten Attribute haben wir nicht erklärt: In der objektorientierten Programmierung sind Attribute sowohl innerhalb der Klassendefinition als auch in den Definitionen aller Klassen, die (direkt oder indirekt) von der Klasse erben, zugänglich. In Python ist dieses Konzept jedoch nicht sehr sinnvoll.

Möchtest Du informiert bleiben?

Schreib uns Deine E-Mail-Adresse, damit wir Dir die neuesten Artikel zum Zeitpunkt der Veröffentlichung zusenden können!