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!
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:
- Über die Klasse selbst:
Hund.art
- Über jede Instanz der Klasse:
fluffy.art
oderbuddy.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:
- Speichern von Konstanten, die für alle Instanzen einer Klasse gleich sein sollten.
- Verfolgen von Daten über alle Instanzen einer Klasse (wie unser
Katze.anzahl
-Beispiel). - 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:
- Klassenattribute werden von allen Instanzen geteilt, während Instanzattribute Unique für jede Instanz sind.
- Klassenattribute werden innerhalb der Klasse, aber außerhalb aller Methoden definiert, während Instanzattribute typischerweise innerhalb der
__init__
-Methode definiert werden. - 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