@NoPy: Mit ``class XYZ`` wird ein Klassenobjekt erzeugt und an den Namen `XYZ` gebunden. Auf der Ebene der Klasse definierst Du zwei Attribute `S` und `__init__` (ich gehe mal davon aus da sollte ``def`` davor stehen

). Diese beiden Attribute sind von der Klasse abfragbar, ganz normal per Attributzugriff.
Wenn man `XYZ` aufruft wird ein Objekt vom Typ `XYZ` erstellt und mit diesem Objekt als Argument wird die `__init__`-Methode aufgerufen. Und dort wird auf dem Objekt das Attribut `T` gebunden.
Danach kann man auf die Attribute des Objektes zugreifen, also direkt auf die Attribute auf dem Objekt, und wenn ein Attribut dort nicht gefunden wird, dann wird in der Klassenhierarchie danach auf den Klassenobjekten gesucht. Also haben auch Objekte vom Typ `XYZ` indirekt ein `__init__`- und ein `S`-Attribut. Eben das vom Klassenobjekt. Wo man sehr aufpassen muss ist beim Zuweisen, denn wenn man einem Objekt ein Attribut zuweist landet das immer auf *dem* Objekt, auch wenn es in der Klassenhierchie ein Attribut mit dem selben Namen gibt:
Code: Alles auswählen
In [1]: class A(object):
...: a = 1
...: def __init__(self):
...: self.b = 2
...:
In [2]: A.a
Out[2]: 1
In [3]: x, y = A(), A()
In [4]: x.a
Out[4]: 1
In [5]: y.a
Out[5]: 1
In [6]: x.b, y.b
Out[6]: (2, 2)
In [7]: A.a = 42
In [8]: x.a, y.a
Out[8]: (42, 42)
In [9]: x.b = 23
In [10]: x.b, y.b
Out[10]: (23, 2)
In [11]: y.a = 4711
In [12]: A.a, x.a, y.a
Out[12]: (42, 42, 4711)
In [11] wird dem Objekt das an `y` gebunden ist ein neues `a`-Attribut hinzugefügt und nicht etwa das `a`-Attribut auf dem Klassenobjekt neu gebunden. Wenn man das will muss man auch explizit über das Klassenobjekt gehen wie in [7].
Wir meinen also mit Klassenvariable oder Klassenattribut das selbe wie Du (eventuell etwas mehr weil Methoden auch Attribute sind, wo andere Sprachen manchmal stärker zwischen Daten und Methoden unterscheiden). Und ein Instanz-Zähler ist ein schlechtes Beispiel weil der nicht zuverlässig funktionieren würde, zumindest dann nicht wenn Objekte auch wieder „verschwinden” müssen.
Ergänzend zu cofi: Ängste und Nöte an konstruierten Beispielen haben oft auch das Problem dass sie an der Realität vorbei gehen. Es gibt sicher oft Lösungen zu konkreten Problemen die komplett anders aussehen als das konstruierte Beispiel und damit das Problem im Beispiel gar nicht erst auftritt. Zum Beispiel das man zum Mischen gar keinen extra allgemeinen Containertyp braucht, sondern `random.shuffle()` mit jedem Typ klar kommt, der sich wie eine Sequenz verhält. Egal ob das nun konkret ein Typ ist der Karten oder Dominosteine verwaltet, oder sonst irgend etwas.