Es gibt einige unterschiedliche Wege innerhalb einer Klasse auf Klassenattribute zuzugreifen, die sich teilweise in bestimmten Situationen verschieden verhalten.
===== Klassenmethode =====
class base():
a=5
@classmethod
def ausgabe(cls):
print(cls.a)
class child(base)
a=10
* Der Aufruf von "base.ausgabe" gibt 5 aus.
* Der Aufruf von "child.ausgabe" gibt 10 aus
* das liegt daran das der Parameter cls erst zum Zeitpunkt des Aufrufs übergeben wird und dann die Klasse repräsentiert über die die Funktion aufgerufen wird
===== __class__ =====
class base():
a=5
@staticmethod
def ausgabe():
print(__class__.a)
@staticmethod
def ausgabe_neu():
print(__class__.a)
class child(base)
a=10
* Aufruf von "base.ausgabe" gibt 5 aus.
* Aufruf von "child.ausgabe" gibt 5 aus
* Aufruf von child.ausgabe_neu gibt 10 aus
__class__ verweist auf die Klasse in der die (statische) Methode deklariert wurde, nicht auf die über die sie aufgerufen wird! \\
Da .ausgabe in base deklariert wurde, verweist __class__ auf base, im Gegensatz zu .ausgabe_neu welches in child deklariert wurde und dessen __class__ dann auf child verweist.
===== Direkter Verweis =====
class base():
a=5
@staticmethod
def ausgabe():
print(base.a)
class child(base)
a=10
* base.ausgabe gibt 5 aus
* child.ausgabe gibt 5 aus
* base.a verweist immer auf a in der Klasse base und damit auf den Wert 5