Python Generics: Ein Anfängerleitfaden

Hallo da, zukünftiger Python-Meister! Heute machen wir uns auf eine aufregende Reise in die Welt der Python Generics. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind – ich werde Ihr freundlicher Guide sein und alles Schritt für Schritt erklären. Holen Sie sich also eine Tasse Ihres Lieblingsgetränks und tauchen wir ein!

Python - Generics

Was sind Generics?

Bevor wir mit dem Coden beginnen, lassen Sie uns verstehen, was Generics sind. Stellen Sie sich eine magische Box vor, die jeden Gegenstand aufnehmen kann – Spielzeug, Bücher oder sogar Kekse. Genau das machen Generics im Programmieren. Sie erlauben es uns, flexiblen Code zu schreiben, der mit verschiedenen Datentypen arbeiten kann.

Definition einer generischen Funktion

Lassen Sie uns mit der Erstellung einer generischen Funktion beginnen. In Python verwenden wir TypeVar aus dem Modul typing, um generische Typen zu definieren.

from typing import TypeVar

T = TypeVar('T')

def print_item(item: T) -> None:
print(f"Das Element ist: {item}")

In diesem Beispiel ist T unser generischer Typ. Die Funktion print_item kann jetzt jeden Datentyp akzeptieren. Lassen Sie uns das aufschlüsseln:

  1. Wir importieren TypeVar aus dem Modul typing.
  2. Wir erstellen eine Typvariablen T.
  3. Unsere Funktion print_item nimmt ein Argument item vom Typ T.
  4. Die Funktion gibt einfach das Element aus.

Aufruf der generischen Funktion mit verschiedenen Datentypen

Nun sehen wir unsere generische Funktion in Aktion!

print_item(42)
print_item("Hello, Generics!")
print_item([1, 2, 3])

Ausgabe:

Das Element ist: 42
Das Element ist: Hello, Generics!
Das Element ist: [1, 2, 3]

Wie Sie sehen, funktioniert unsere Funktion mit verschiedenen Datenarten – ganze Zahlen, Zeichenketten und sogar Listen. Es ist wie ein Schweizer Army Knife in Ihrem Code-Toolkit!

Definition einer generischen Klasse

Nun, da wir generische Funktionen gemeistert haben, lassen Sie uns einen Level aufsteigen und eine generische Klasse erstellen. Stellen wir uns ein einfaches Speichersystem vor, das jeden Gegenstand aufnehmen kann.

from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
def __init__(self, item: T):
self.item = item

def get_item(self) -> T:
return self.item

def set_item(self, new_item: T) -> None:
self.item = new_item

Lassen Sie uns diese magische Box analysieren:

  1. Wir definieren unsere Klasse Box als Generic[T].
  2. Die Methode __init__ nimmt ein item vom Typ T.
  3. get_item gibt das gespeicherte Element zurück.
  4. set_item ermöglicht es uns, das Element zu ändern.

Jetzt setzen wir unsere Box ein:

# Eine Box für ganze Zahlen
int_box = Box(42)
print(int_box.get_item())  # Ausgabe: 42

# Eine Box für Zeichenketten
str_box = Box("Hello, Generic Class!")
print(str_box.get_item())  # Ausgabe: Hello, Generic Class!

# Ändern des Elements in der Box
int_box.set_item(100)
print(int_box.get_item())  # Ausgabe: 100

Ist das nicht toll? Wir können Boxen erstellen, um verschiedene Arten von Gegenständen zu speichern, und Python stellt für uns Typsicherheit sicher.

Die Macht der Generics

Generics mögen am Anfang etwas abstrakt erscheinen, aber sie sind unglaublich leistungsstark. Sie ermöglichen es uns, Code zu schreiben, der sowohl flexibel als auch typsicher ist. Stellen Sie sich vor, Sie bauen eine große Anwendung – Generics können Ihnen helfen, wiederverwendbare Komponenten zu erstellen, die mit verschiedenen Datentypen arbeiten, was Ihnen Zeit spart und Fehler reduziert.

Hier ist ein komplexeres Beispiel, um diese Macht zu verdeutlichen:

from typing import Generic, TypeVar, List

T = TypeVar('T')

class Storage(Generic[T]):
def __init__(self):
self.items: List[T] = []

def add_item(self, item: T) -> None:
self.items.append(item)

def get_items(self) -> List[T]:
return self.items

def get_last_item(self) -> T:
if self.items:
return self.items[-1]
raise IndexError("Speicher ist leer")

# Verwendung unserer generischen Storage-Klasse
int_storage = Storage[int]()
int_storage.add_item(1)
int_storage.add_item(2)
int_storage.add_item(3)

str_storage = Storage[str]()
str_storage.add_item("Apple")
str_storage.add_item("Banana")
str_storage.add_item("Cherry")

print(int_storage.get_items())  # Ausgabe: [1, 2, 3]
print(str_storage.get_last_item())  # Ausgabe: Cherry

In diesem Beispiel haben wir eine generische Storage-Klasse erstellt, die Listen jeglicher Art aufnehmen kann. Wir haben dann separate Speicher für ganze Zahlen und Zeichenketten erstellt, um die Flexibilität unserer generischen Klasse zu demonstrieren.

Fazit

Glückwunsch! Sie haben gerade Ihre ersten Schritte in die Welt der Python Generics gemacht. Wir haben generische Funktionen, generische Klassen und sogar ein flexibles Speichersystem erstellt. Denken Sie daran, dass wie jedes leistungsstarke Werkzeug, Generics Übung erfordern, um sie zu meistern. Lassen Sie sich nicht entmutigen, wenn es nicht sofort klickt – experimentieren Sie weiter, und Sie werden很快 die Magie der Generics in Ihrem eigenen Code sehen.

Zum Abschluss hier eine Tabelle, die die wichtigsten Methoden zusammenfasst, die wir gelernt haben:

Methode Beschreibung
TypeVar('T') Erstellt eine Typvariablen für den generischen Gebrauch
Generic[T] Definiert eine generische Klasse
__init__(self, item: T) Initialisiert eine generische Klasse mit einem Element vom Typ T
get_item(self) -> T Gibt ein Element vom Typ T zurück
set_item(self, new_item: T) -> None Setzt ein neues Element vom Typ T
add_item(self, item: T) -> None Fügt ein Element vom Typ T zu einer Sammlung hinzu
get_items(self) -> List[T] Gibt eine Liste von Elementen vom Typ T zurück
get_last_item(self) -> T Gibt das letzte Element vom Typ T in einer Sammlung zurück

Weiter codieren, weiter lernen und denken Sie daran – mit Generics sind Ihre Python-Kräfte unendlich! Viel Spaß beim Coden, zukünftige Python-Zauberer!

Credits: Image by storyset