<Python Panorama Series-6> Beherrschen Sie den Schlüssel zur objektorientierten Programmierung in Python: eingehende Erkundung von Klassen und Objekten

Willkommen zu unserer Blogreihe „Python Panorama Series“! In dieser Serie führen wir Sie Schritt für Schritt von den Grundlagen von Python zu fortgeschrittenen Themen, damit Sie diese leistungsstarke und flexible Programmiersyntax beherrschen. Egal, ob Sie neu in der Programmierung sind oder ein erfahrener Entwickler, diese Serie vermittelt Ihnen das Wissen und die Fähigkeiten, die Sie benötigen.

Dieser Artikel ist der sechste Artikel in der Python-Panorama-Reihe und befasst sich mit den Kernkonzepten der Python-Sprache: Klasse und Objekt. Wir stellen diese Grundkonzepte vor und zeigen dann anhand von Beispielcode im Detail, wie Klassen und Objekte in Python funktionieren, einschließlich Definition, Instanziierung und Änderung. Dieser Artikel wird Ihnen helfen, ein tieferes Verständnis der objektorientierten Programmierung (OOP) in Python zu erlangen und einige ungewöhnliche, aber nützliche technische Erkenntnisse zu liefern.

1. Abstrakte Konzepte von Klassen und Objekten

Die Konzepte von Klassen und Objekten sind die Grundlage der objektorientierten Programmierung (OOP). In Python bieten objektorientierte Entwurfsmethoden eine effiziente Möglichkeit, Daten und Funktionalität zu kapseln. Es ermöglicht uns, reale Dinge und Verhaltensweisen in Code abzubilden. Diese Abbildung entspricht eher unserem menschlichen kognitiven Stil und ermöglicht es uns, komplexe Softwaresysteme auf natürlichere Weise zu verstehen und zu entwerfen.

Klassenabstraktion

Eine Klasse ist eine abstrakte Vorlage, die zur Beschreibung einer Sammlung von Objekten mit gemeinsamen Eigenschaften und Methoden verwendet wird. Eine Klasse definiert die gemeinsame Struktur und das Verhalten dieser Objekte, belegt aber selbst keinen Speicherplatz. Eine Klasse ist ein Mechanismus zum Erstellen neuer Objekte und stellt eine Regel und einen Standard für die Erstellung und Verwaltung von Objekten bereit.

Objektmaterialisierung

Im Gegensatz dazu ist ein Objekt eine Instanz einer Klasse, die konkret existiert und Speicherplatz beansprucht. Jedes Objekt hat seine eigenen Eigenschaften und Verhaltensweisen, die durch seine Klasse definiert werden. Jeder Eigenschaft eines Objekts ist ein Wert zugeordnet, der sich während der Lebensdauer des Objekts ändern kann, und sein Verhalten wird durch Methoden definiert.

Einzigartigkeit des Objekts

Obwohl eine Klasse als mehrere Objekte instanziiert werden kann, ist jedes Objekt einzigartig. Selbst wenn zwei Objekte derselben Klasse angehören und dieselben Eigenschaftswerte haben, handelt es sich um unterschiedliche Objekte. id()Jedes Objekt verfügt über eine eindeutige Kennung (die über integrierte Funktionen in Python abgerufen werden kann ), die zur Unterscheidung verschiedener Objekte verwendet wird.

Die Beziehung zwischen Klassen und Objekten

Die Beziehung zwischen Klassen und Objekten kann mit einem Bauplan und einem Haus oder einem Rezept und einem Gericht verglichen werden. Klassen sind wie Baupläne oder Rezepte und bieten detaillierte Anweisungen zum Erstellen eines Objekts (eines Hauses oder einer Schüssel). Sie können denselben Bauplan oder dasselbe Rezept verwenden, um mehrere Häuser oder Gerichte zu erstellen, genauso wie Sie dieselbe Klasse verwenden können, um mehrere Objekte zu erstellen.

einzigartige Einblicke

Das Verständnis der abstrakten Ideen von Klassen und Objekten hilft uns nicht nur beim Schreiben und Lesen von objektorientiertem Code, sondern hilft uns auch, die reale Welt besser zu verstehen. In der realen Welt müssen wir oft mit Sammlungen von Dingen mit ähnlichen Eigenschaften und Verhaltensweisen umgehen, genau wie wir es mit Objekten in der Programmierung tun.

Bei der objektorientierten Programmierung kapseln wir Daten und Methoden zur Datenverarbeitung zusammen, um „Objekte“ zu bilden. Diese Kapselung von Daten und Vorgängen ermöglicht es uns, komplexe Softwaresysteme effizienter zu organisieren und zu verwalten. Tatsächlich lassen uns die Konzepte von Klassen und Objekten erkennen, dass viele komplexe Probleme in der realen Welt durch Abstraktion und Kapselung vereinfacht werden können, was es einfacher macht

verstanden und angesprochen werden. Es ist eine Möglichkeit, Ordnung im Chaos und Einfachheit in der Komplexität zu finden. Dies ist auch ein wichtiger Grund, warum die objektorientierte Programmierung unter vielen Programmierparadigmen einzigartig ist.

2. Klasse: die Art und Weise, Datentypen zu definieren

In Python ist eine Klasse eine Möglichkeit, einen neuen Datentyp zu definieren, der Daten (Eigenschaften) und Funktionen (Methoden) kapselt, die mit den Daten innerhalb eines logischen Rahmens arbeiten. Dieses Konzept hilft uns, komplexere Datenmodelle zu erstellen, um verschiedene Objekte in der realen Welt und deren Interaktion zu simulieren.

Die Kernfunktionen der Klasse sind wie folgt:

  1. Datenkapselung : Die Attribute in der Klasse speichern den Zustand des Objekts. Diese Eigenschaften werden normalerweise __init__innerhalb von Methoden initialisiert und können während des Lebenszyklus des Objekts abgerufen und geändert werden. Die Kapselung gewährleistet Datenintegrität und -konsistenz.

  2. Verhaltensabstraktion : Die in einer Klasse definierten Methoden beschreiben die Operationen, die ein Objekt ausführen kann. Diese Methoden können auf den Zustand des Objekts zugreifen und ihn ändern oder mit anderen Objekten interagieren.

  3. Vererbung : Eine Klasse kann die Eigenschaften und Methoden einer anderen Klasse erben, was die Wiederverwendung von Code und die Anpassung des Verhaltens ermöglicht. Dies ist ein wichtiger Mechanismus zum Erreichen von Polymorphismus und Code-Wiederverwendung.

  4. Polymorphismus : Aufgrund der Vererbung können Instanzen einer Klasse zu mehr als einer Klasse gehören. Mit Python können wir Unterklassenobjekte anstelle von übergeordneten Klassenobjekten verwenden und so die Flexibilität und Wiederverwendbarkeit des Codes verbessern.

Schauen wir uns als Nächstes ein Beispiel einer komplexeren Klassendefinition an, wobei wir verschiedene Arten von Arbeitern als Beispiele verwenden.

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self):
        return f"{self.name} is working."

class Manager(Employee):
    def work(self):
        return f"{self.name} is managing the team."

class Developer(Employee):
    def __init__(self, name, age, programming_language):
        super().__init__(name, age)
        self.programming_language = programming_language

    def work(self):
        return f"{self.name} is writing {self.programming_language} code."

In diesem Beispiel definieren wir eine Basisklasse namens Employee und zwei Unterklassen Manager und Developer, die von Employee erben. Jede Klasse hat eine workMethode, aber das Verhalten dieser Methode ist in verschiedenen Unterklassen unterschiedlich. Dies ist ein Beispiel für Polymorphismus. Gleichzeitig fügt die Developer-Klasse ein neues Attribut hinzu programming_languageund zeigt, wie neue Attribute in Unterklassen hinzugefügt werden.

Klassen bieten einen Abstraktionsmechanismus auf hoher Ebene, der es uns ermöglicht, komplexe Softwaresysteme auf eine Weise zu entwerfen und zu implementieren, die den menschlichen Denkgewohnheiten besser entspricht. Die Beherrschung der Konzepte von Klassen und Objekten ist entscheidend für das Verständnis und die Verwendung der Python-Programmierung.

3. Objekt: Instanziierung einer Klasse

Sobald wir in Python eine Klasse definiert haben, können wir ein Objekt erstellen, indem wir die Klasse instanziieren. Ein Objekt ist eine Instanz einer Klasse, die die von der Klasse definierten Eigenschaften und Methoden erbt.

Lassen Sie uns weiterhin die Klasse „Hund“ verwenden, um diesen Prozess im Detail zu verstehen:

fido = Dog("Fido", 3)
buddy = Dog("Buddy", 5)

Hier sind Dog("Fido", 3)und Dog("Buddy", 5)Ausdrücke, die neue Dog-Objekte erstellen. Es handelt sich um zwei verschiedene Instanzen der Dog-Klasse, jede mit ihren eigenen Namens- und Alterseigenschaften. Obwohl Fido und Buddy beide Instanzen der Dog-Klasse sind, handelt es sich um zwei völlig unterschiedliche Objekte.

Sie können sich den Prozess wie die Herstellung von Süßigkeiten vorstellen. Eine Klasse ist wie eine Bonbonform, und jede Instanz (Objekt) ist wie ein aus der Form hergestelltes Bonbon. Obwohl alle Bonbons aus der gleichen Form hergestellt werden und die gleiche Form und Größe haben, handelt es sich dennoch um individuelle Bonbons mit jeweils eigener Farbe und eigenem Geschmack.

Dies führt zu einem wichtigen Merkmal von Python-Objekten: Jedes Objekt hat seinen eigenen Namensraum und speichert seine eigenen Attribute. Diese Eigenschaften sind unabhängig von anderen Objekten. Beispielsweise können wir die Alterseigenschaft von fido wie folgt ändern, ohne dass sich dies auf die Alterseigenschaft von buddy auswirkt:

fido.age = 4
print(fido.age)  # 4
print(buddy.age)  # 5

Darüber hinaus können Objekte Methoden haben. Methoden sind in einer Klasse definierte Funktionen, die auf die Eigenschaften eines Objekts zugreifen und diese ändern können. Beispielsweise können wir eine celebrate_birthdayMethode definieren, die die Alterseigenschaft des Dog-Objekts erhöht:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return f"{self.name} says Woof!"

    def celebrate_birthday(self):
        self.age += 1
        return f"Happy Birthday {self.name}! You are now {self.age} years old."

fido = Dog("Fido", 3)
print(fido.celebrate_birthday())  # "Happy Birthday Fido! You are now 4 years old."

Im Allgemeinen sind Objekte Instanzen von Klassen und erben die Eigenschaften und Methoden der Klasse. Jedes Objekt hat seinen eigenen Zustand (Eigenschaften) und Verhalten (Methoden). In Python können wir ein Objekt erstellen, indem wir eine Klasse instanziieren und dann die Punktnotation verwenden, .um auf die Eigenschaften des Objekts zuzugreifen und diese zu ändern oder die Methoden des Objekts aufzurufen.

4. Klassenvererbung: Wiederverwendung und Erweiterung von Code

In Python kann eine Klasse von einer anderen Klasse erben, was bedeutet, dass sie automatisch alle Eigenschaften und Methoden der übergeordneten Klasse erhält. Dies ist ein Kernkonzept der objektorientierten Programmierung und kann uns dabei helfen, die Wiederverwendung und Erweiterung von Code zu erreichen.

Angenommen, wir haben eine Basisklasse „Tier“, die über einige gemeinsame Eigenschaften und Methoden verfügt, wie z. B. die Eigenschaften „Name“ und „Alter“ sowie eine Methode „Sound“. Jetzt wollen wir zwei neue Klassen erstellen: „Hund“ und „Katze“. Sie sollten beide über die Eigenschaften „name“ und „age“ verfügen, und beide sollten über ihre eigene „sound“-Methode verfügen.

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sound(self):
        pass


class Dog(Animal):
    def sound(self):
        return f"{self.name} says Woof!"


class Cat(Animal):
    def sound(self):
        return f"{self.name} says Meow!"

In diesem Beispiel erben die Klassen „Dog“ und „Cat“ beide von der Klasse „Animal“, sodass sie automatisch alle Eigenschaften und Methoden der Klasse „Animal“ erhalten. Anschließend haben wir die „Sound“-Methode in den Klassen „Dog“ und „Cat“ überschrieben, um entsprechende Implementierungen bereitzustellen.

Durch Vererbung kann unser Code modularer, einfacher zu warten und zu erweitern sein. Wir können einige allgemeine Eigenschaften und Methoden in die Basisklasse einfügen und dann bestimmte Verhaltensweisen in der abgeleiteten Klasse hinzufügen oder überschreiben. Auf diese Weise können wir Code aus der Basisklasse wiederverwenden, ohne denselben Code in jeder abgeleiteten Klasse wiederholen zu müssen.

Sie können sich diesen Vorgang wie die Herstellung eines Lego-Modells vorstellen. Die Basisklasse ist wie die Basis eines Lego-Modells und die abgeleiteten Klassen sind wie die verschiedenen Legosteine, die der Basis hinzugefügt werden. Wir können dieselbe Basis verwenden, um eine Vielzahl unterschiedlicher LEGO-Modelle zu bauen, indem wir einfach die hinzugefügten Steine ​​austauschen. So funktioniert die Wiederverwendung von Code.

Darüber hinaus unterstützt Python die Mehrfachvererbung, d. h. eine Klasse kann mehrere übergeordnete Klassen erben. Dies verbessert die Wiederverwendbarkeit und Erweiterbarkeit des Codes weiter, führt aber auch zu einer gewissen Komplexität. Bei der Mehrfachvererbung müssen wir auf mögliche Konflikte zwischen Eigenschaften und Methoden verschiedener übergeordneter Klassen achten.

Im Allgemeinen ist die Klassenvererbung ein leistungsstarkes Werkzeug, das uns dabei helfen kann, Code wiederzuverwenden und zu erweitern, um komplexere Funktionen zu erreichen. Beim Entwerfen einer Klassenstruktur sollten wir die Vorteile der Vererbung voll ausnutzen und gleichzeitig darauf achten, Probleme durch übermäßigen Gebrauch der Vererbung zu vermeiden.

5. Magische Methoden: Steuern Sie das Verhalten einer Klasse

Python-Klassen können spezielle Methoden definieren, die unter bestimmten Umständen automatisch aufgerufen werden. Da ihre Methodennamen mit einem doppelten Unterstrich beginnen und enden, werden sie oft als „magische Methoden“ oder „spezielle Methoden“ bezeichnet. Durch die Definition magischer Methoden können wir das Verhalten einer Klasse steuern, z. B. den Instanziierungsprozess, den Zugriff auf Eigenschaften, die Überladung von Operatoren usw.

Wenn wir beispielsweise eine Klasse instanziieren, __init__wird die magische Methode automatisch aufgerufen:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

In diesem Beispiel __init__wird die Methode jedes Mal ausgeführt, wenn eine neue Instanz der Dog-Klasse erstellt wird, um den Status der neuen Instanz zu initialisieren.

Wir können auch andere magische Methoden definieren, um individuelleres Verhalten zu erreichen. Wir können beispielsweise __str__Methoden definieren, um zu steuern, wie ein Objekt angezeigt wird, wenn wir es drucken:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"A dog named {self.name}, age {self.age}"

fido = Dog("Fido", 3)
print(fido)  # "A dog named Fido, age 3"

Wenn wir in diesem Beispiel das Fido-Objekt drucken, ruft Python automatisch seine __str__Methode auf und verwendet seinen Rückgabewert als gedruckten Inhalt.

Magic-Methoden sind wie ein Bedienfeld für Python-Klassen. Durch Anpassen der verschiedenen Schalter und Knöpfe auf diesem Bedienfeld können wir das Verhalten der Klasse genau steuern. Sie können sich diesen Vorgang wie das Autofahren vorstellen. Der Fahrer kann die Fahrtrichtung, Geschwindigkeit und Position des Fahrzeugs durch Betätigung des Lenkrads, der Bremsen, des Gaspedals und anderer Bedienelemente genau steuern. Ebenso können wir durch die Definition und Verwendung magischer Methoden das Verhalten einer Python-Klasse präzise steuern.

Bei der Verwendung magischer Methoden gibt es jedoch Einschränkungen. Einerseits kann der übermäßige Einsatz magischer Methoden dazu führen, dass Code schwer zu verstehen und zu warten ist. Wenn wir andererseits die magische Methode der übergeordneten Klasse in der Unterklasse überschreiben, kann dies zu unvorhersehbaren Ergebnissen führen. Daher müssen wir beim Einsatz magischer Methoden vorsichtig sein und bewährte Praktiken befolgen.

Im Allgemeinen sind magische Methoden ein leistungsstarkes Werkzeug für die objektorientierte Python-Programmierung, mit dem wir das Verhalten von Klassen anpassen und mehr Funktionen erreichen können. Beim Entwerfen von Klassen sollten wir die Vorteile magischer Methoden voll ausnutzen und gleichzeitig darauf achten, potenzielle Probleme zu vermeiden.

6. Polymorphismus in Python: Die Kraft der dynamischen Typisierung

In der objektorientierten Programmierung ist Polymorphismus eine Funktion, die es uns ermöglicht, mit verschiedenen Objekttypen auf einheitliche Weise umzugehen. Es macht unseren Code flexibler und erweiterbarer. In Python spiegelt sich Polymorphismus hauptsächlich in seinem dynamischen Typsystem wider.

Python ist eine dynamisch typisierte Sprache, was bedeutet, dass die Variablentypen zur Laufzeit und nicht zur Kompilierungszeit bestimmt werden. Dadurch können wir Code schreiben, ohne uns um den spezifischen Typ des Objekts zu kümmern, solange das Objekt die erwartete Methode oder Eigenschaft implementiert.

Betrachten Sie das folgende Beispiel:

class Dog:
    def sound(self):
        return "Woof!"

class Cat:
    def sound(self):
        return "Meow!"

def make_sound(animal):
    return animal.sound()

fido = Dog()
whiskers = Cat()

print(make_sound(fido))  # "Woof!"
print(make_sound(whiskers))  # "Meow!"

In diesem Beispiel make_soundkann die Funktion jedes Objekt akzeptieren, das sounddie Methode implementiert, unabhängig davon, ob es sich um eine Instanz der Dog-Klasse, eine Instanz der Cat-Klasse oder eine Instanz einer anderen Klasse handelt. Dies ist die Verkörperung des Polymorphismus. Unser Code kümmert sich nicht um den spezifischen Typ des übergebenen Objekts, sondern nur um dessen Verhalten.

Sie können sich diesen Vorgang wie Steckdosen und verschiedene elektronische Geräte vorstellen. Den Steckdosen ist es egal, ob Sie einen Fernseher, einen Computer oder einen Haartrockner anschließen, solange ihre Stecker den Standards entsprechen. Ebenso kümmern sich unsere make_soundFunktionen nicht um den spezifischen Typ der übergebenen Objekte, solange sie die erwarteten soundMethoden implementieren. So funktioniert der Python-Polymorphismus.

Beim Entwerfen von Klassen und Funktionen sollten wir den Polymorphismus von Python so weit wie möglich nutzen. Wir sollten uns auf das Verhalten von Objekten konzentrieren, nicht auf ihre spezifischen Typen. Dadurch wird unser Code flexibler und skalierbarer und lässt sich leichter an sich ändernde Anforderungen anpassen.

Bei der Verwendung von Polymorphismus sind jedoch einige Probleme zu beachten. Wenn wir uns zu stark auf das spezifische Verhalten eines Objekts verlassen, kann dies dazu führen, dass der Code schwer zu verstehen und zu warten ist. Darüber hinaus kann es zu Laufzeitfehlern kommen, wenn das übergebene Objekt nicht das erwartete Verhalten implementiert. Daher müssen wir bei der Verwendung von Polymorphismus vorsichtig sein und Best Practices befolgen.

Insgesamt ist Polymorphismus ein leistungsstarkes Werkzeug für die objektorientierte Python-Programmierung, das uns helfen kann, flexibleren und skalierbareren Code zu schreiben. Beim Entwerfen von Klassen sollten wir den Polymorphismus von Python voll ausnutzen und gleichzeitig darauf achten, potenzielle Probleme zu vermeiden.

7. Zusammenfassung

Python-Klassen und -Objekte sind der Grundstein für das Verständnis der objektorientierten Programmierung. Klassen bieten eine Möglichkeit, Daten und Funktionen in einem eigenständigen Entwurf zu kapseln und so mehrere unabhängige Instanzen – Objekte – zu generieren. Diese Objekte verfügen über alle in der Klasse definierten Eigenschaften und Methoden und bündeln Daten und Verhalten. Die Klassenvererbung ermöglicht die Wiederverwendung und Erweiterung von Code, während magische Methoden es uns ermöglichen, das spezielle Verhalten der Klasse anzupassen. Die dynamische Typisierung und der Polymorphismus von Python bieten große Flexibilität bei der Programmierung, realisieren eine einheitliche Verarbeitungsmethode für verschiedene Objekte und verbessern die Lesbarkeit und Skalierbarkeit des Codes.

Wenn es hilft, schenken Sie TeahLead KrisChang bitte mehr Aufmerksamkeit, mehr als 10 Jahre Erfahrung in der Internet- und Künstliche-Intelligenz-Branche, mehr als 10 Jahre Erfahrung im technischen und geschäftlichen Teammanagement, Bachelor-Abschluss in Software-Engineering von Tongji, Master-Abschluss in Engineering Management aus Fudan, Alibaba Cloud-zertifizierter Senior-Architekt für Cloud-Dienste, Leiter des KI-Produktgeschäfts mit einem Umsatz von über 100 Millionen.

Microsoft startet neue „Windows App“ .NET 8 offiziell GA, die neueste LTS-Version Xiaomi gab offiziell bekannt, dass Xiaomi Vela vollständig Open Source ist und der zugrunde liegende Kernel NuttX Alibaba Cloud 11.12 ist. Die Ursache des Fehlers wurde offengelegt: Access Key Service (Access Schlüssel) Ausnahme Vite 5 offiziell veröffentlichter GitHub-Bericht: TypeScript ersetzt Java und wird zur drittbeliebtesten Sprache. Bietet eine Belohnung von Hunderttausenden Dollar für das Umschreiben von Prettier in Rust. Den Open-Source-Autor fragen: „Ist das Projekt noch am Leben?“ Sehr unhöflich und respektloses Bytedance: Verwendung von KI zur automatischen Optimierung von Linux-Kernel-Parameteroperatoren. Zauberoperation: Trennen Sie das Netzwerk im Hintergrund, deaktivieren Sie das Breitbandkonto und zwingen Sie den Benutzer, das optische Modem zu wechseln
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/6723965/blog/10116138
Recomendado
Clasificación