Python - Klassenattribute

Hallo, aufstrebende Programmierer! Heute Tauchen wir in die aufregende Welt der Python-Klassenattribute ein. Keine Sorge, wenn du neu bei der Programmierung bist; ich werde dich auf dieser Reise Schritt für Schritt führen, genau wie ich es für unzählige Studenten in meinen Jahren des Unterrichtens getan habe. Also, los geht's!

Python - Class Attributes

Klassenattribute (Variablen)

Klassenattribute sind Variablen, die der gesamten Klasse gehören und nicht einem bestimmten Instanz der Klasse. Stelle dir vor, sie seien Eigenschaften, die von allen Objekten dieser Klasse geteilt werden.

Lass uns mit einem einfachen Beispiel beginnen:

class Hund:
art = "Canis familiaris"

def __init__(self, name, alter):
self.name = name
self.alter = alter

fluffy = Hund("Fluffy", 3)
buddy = Hund("Buddy", 5)

print(Hund.art)  # Ausgabe: Canis familiaris
print(fluffy.art)  # Ausgabe: Canis familiaris
print(buddy.art)  # Ausgabe: Canis familiaris

In diesem Beispiel ist art ein Klassenattribut. Es wird direkt innerhalb der Klasse definiert, aber außerhalb von allen Methoden. Alle Hund-Objekte teilen diese Eigenschaft.

Zugriff auf Klassenattribute

Wie du aus dem Beispiel oben siehst, kannst du auf Klassenattribute auf zwei Arten zugreifen:

  1. Über die Klasse selbst: Hund.art
  2. Über jede Instanz der Klasse: fluffy.art oder buddy.art

Beide Wege führen zu dem gleichen Ergebnis. Es ist, als ob du fragst, "Welche Art von Hunden gibt es?" oder "Welche Art ist Fluffy?" - die Antwort ist die gleiche!

Ändern von Klassenattributen

Klassenattribute können geändert werden, aber sei vorsichtig! Wenn du ein Klassenattribut änderst, ändert es sich für alle Instanzen der Klasse. Lass uns ein Beispiel sehen:

class Katze:
art = "Felis catus"
anzahl = 0

def __init__(self, name):
self.name = name
Katze.anzahl += 1

whiskers = Katze("Whiskers")
mittens = Katze("Mittens")

print(Katze.anzahl)  # Ausgabe: 2
print(whiskers.anzahl)  # Ausgabe: 2
print(mittens.anzahl)  # Ausgabe: 2

Katze.art = "Felis silvestris catus"

print(Katze.art)  # Ausgabe: Felis silvestris catus
print(whiskers.art)  # Ausgabe: Felis silvestris catus
print(mittens.art)  # Ausgabe: Felis silvestris catus

In diesem Beispiel verwenden wir ein Klassenattribut anzahl, um zu verfolgen, wie viele Katzen wir erstellt haben. Jedes Mal, wenn wir ein neues Katze-Objekt erstellen, erhöhen wir Katze.anzahl. Wir haben auch die art für alle Katzen auf einmal geändert, indem wir Katze.art modifiziert haben.

Bedeutung von Klassenattributen

Klassenattribute sind in mehreren Szenarien unglaublich nützlich:

  1. Speichern von Konstanten, die für alle Instanzen einer Klasse gleich sein sollten.
  2. Verfolgen von Daten über alle Instanzen einer Klasse (wie unser Katze.anzahl-Beispiel).
  3. Definieren von Standardwerten, die bei Bedarf in Instanzen überschrieben werden können.

Eingebaute Klassenattribute

Python-Klassen kommen mit einigen eingebauten Attributen, die sehr hilfreich sein können. Lass uns einige ansehen:

class MyClass:
x = 5

def my_method(self):
pass

print(MyClass.__name__)  # Ausgabe: MyClass
print(MyClass.__doc__)  # Ausgabe: None (weil wir keine Dokustring bereitgestellt haben)
print(MyClass.__dict__)  # Ausgabe: {'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__)  # Ausgabe: __main__

Zugriff auf Eingebaute Klassenattribute

Hier ist eine Tabelle einiger häufiger eingebauter Klassenattribute und wie man darauf zugreift:

Attribut Beschreibung Zugriff
name Name der Klasse MyClass.name
doc Dokustring der Klasse MyClass.doc
dict Wörterbuch, das den Namensraum der Klasse enthält MyClass.dict
module Name des Moduls, in dem die Klasse definiert ist MyClass.module
bases Tuple, das die Basisklassen enthält MyClass.bases

Instanzattribute

Jetzt, da wir Klassenattribute verstanden haben, betrachten wir kurz Instanzattribute, um den Unterschied zu sehen. Instanzattribute sind spezifisch für jedes einzelne Objekt, das aus der Klasse erstellt wird.

class Student:
schule = "Python High"  # Klassenattribut

def __init__(self, name, klasse):
self.name = name  # Instanzattribut
self.klasse = klasse  # Instanzattribut

alice = Student("Alice", 10)
bob = Student("Bob", 11)

print(Student.schule)  # Ausgabe: Python High
print(alice.schule)    # Ausgabe: Python High
print(bob.schule)      # Ausgabe: Python High

print(alice.name)      # Ausgabe: Alice
print(bob.name)        # Ausgabe: Bob

Student.schule = "Python University"
print(alice.schule)    # Ausgabe: Python University
print(bob.schule)      # Ausgabe: Python University

alice.schule = "Python Elementary"
print(alice.schule)    # Ausgabe: Python Elementary
print(Student.schule)  # Ausgabe: Python University
print(bob.schule)      # Ausgabe: Python University

Instanzattribute vs. Klassenattribute

Die Hauptunterschiede zwischen Instanz- und Klassenattributen sind:

  1. Klassenattribute werden von allen Instanzen geteilt, während Instanzattribute Unique für jede Instanz sind.
  2. Klassenattribute werden innerhalb der Klasse, aber außerhalb aller Methoden definiert, während Instanzattribute typischerweise innerhalb der __init__-Methode definiert werden.
  3. Das Ändern eines Klassenattributes betrifft alle Instanzen (es sei denn, eine Instanz hat es überschrieben), während das Ändern eines Instanzattributes nur die spezifische Instanz betrifft.

Merke dir, wenn du versuchst, auf ein Attribut einer Instanz zuzugreifen, sucht Python zunächst nach einem Instanzattribut. Wenn es keines findet, sucht es dann nach einem Klassenattribut. Das ist der Grund, warum wir ein Klassenattribut für eine spezifische Instanz "überschreiben" können, indem wir ein Instanzattribut mit dem gleichen Namen erstellen.

Und so ist es! Du hast gerade einen Crashkurs in Python-Klassenattribute abgeschlossen. Denke daran, das Geheimnis der Programmierung zu meistern, ist Praxis. Also mach dir keine Sorgen, mit diesen Konzepten zu experimentieren. Erstelle deine eigenen Klassen, spiele mit Attributen und sieh, was passiert. Frohes Coden!

Credits: Image by storyset