Zählervariable für Klasse

Ich habe Probleme, diesen Code zum Laufen zu bringen. Die Klasse ist Student mit einem IdCounter, und hier scheint das Problem zu liegen. (in Zeile 8)

<code>class Student:
    idCounter = 0
    def __init__(self):
        self.gpa = 0
        self.record = {}
        # Each time I create a new student, the idCounter increment
        idCounter += 1
        self.name = 'Student {0}'.format(Student.idCounter)

classRoster = [] # List of students
for number in range(25):
    newStudent = Student()
    classRoster.append(newStudent)
    print(newStudent.name)
</code>

Ich versuche, diesen IDCounter in meinem zu habenStudent Klasse, so kann ich es als Teil des Schülernamens haben (was zum Beispiel wirklich eine ID # istStudent 12345. Aber ich habe Fehler bekommen.

<code>Traceback (most recent call last):
  File "/Users/yanwchan/Documents/test.py", line 13, in <module>
    newStudent = Student()
  File "/Users/yanwchan/Documents/test.py", line 8, in __init__
    idCounter += 1
UnboundLocalError: local variable 'idCounter' referenced before assignment
</code>

Ich habe versucht, den idCounter + = 1 vor, nach und nach zu kombinieren, aber ich bekomme immer noch denreferenced before assignment Fehler, kannst du mir erklären, was ich falsch mache?

 George04. Apr. 2012, 07:32
Warum habe ich nicht darüber nachgedacht ... (Ursprünglich schrieb mein CodeStudent.idCounter = 0)
 Ignacio Vazquez-Abrams04. Apr. 2012, 07:28
Haben Sie sich die folgende Zeile angesehen?
 bereal04. Apr. 2012, 08:13
Abgesehen von dem speziellen Fehler sind Inkremente in Python nicht atomar, so dass der naive Zähler Race-Bedingungen verursachen kann. Der bessere Weg wäre zu benutzenitertools.count.
 hussam09. Feb. 2018, 06:52
hat anhand Ihres Beispiels eine Anschlussfrage zu Ihrer Frage gestelltHier

Antworten auf die Frage(2)

Lösung für das Problem
<code>class Student:
    # A student ID counter
    idCounter = 0
    def __init__(self):
        self.gpa = 0
        self.record = {}
        # Each time I create a new student, the idCounter increment
        Student.idCounter += 1
        self.name = 'Student {0}'.format(Student.idCounter)

classRoster = [] # List of students
for number in range(25):
    newStudent = Student()
    classRoster.append(newStudent)
    print(newStudent.name)
</code>

.

 George04. Apr. 2012, 07:34
Ja, eigentlich ist es nur ein Zähler und sonst nichts. (Ich weiß nicht wirklich, was ich dazu kommentieren soll, vielleicht sollte ich den Kommentar einfach alle zusammen entfernen). Vielen Dank, Ignacio Vazquez-Abrams.
 Ignacio Vazquez-Abrams04. Apr. 2012, 07:32
Beachten Sie auch, dass Ihr erster Kommentar grob ungenau ist.

herauszufinden, was ich brauchte, um Klassen- und Instanzvariablen sowie deren Gültigkeitsbereich zu bestimmen. Also eine Erweiterung, die dasselbe macht, nur mit einem Generator. Der Generator weist dem Schüler wie idCounter eine eindeutige Nummer zu - nur er verbraucht die Werte. Es gibt keinvorh Methode für die Generatorklasse, die mir bekannt ist. Weder idGenerator noch idCounter werden gespeichert. Wenn Sie also die Liste auslagern möchten, um einen oder mehrere Schüler hinzuzufügen, müssen Sie den Bereich entsprechend aktualisieren (start ,,) oder jeden Wert durchlaufen, ohne ihn zuzuweisen, bis Sie ihn hinzugefügt haben Erreichen Sie nacheinander den eindeutigen Pfad, der mit idCounter etwas kürzer ist und den Sie einfach mit einem einzigen Dummy-Instanzkonstrukt festlegen und loslegen.

<code>class Student:
    """ Implement a shared generator among all sub-classes
    in addition to idCounter. """

    # A student ID counter
    idCounter = 0
    # A student ID from generator
    idGenerator = (x for x in range(0xAAAAAA, 0xEEEEEE, 0xBA))

    def __init__(self):
        self.gpa = 0
        self.record = {}
        # Each time I create a new student, the idCounter increment
        Student.idCounter += 1
        self.id = Student.idGenerator.__next__()
        self.name = f"{self.id} Student {Student.idCounter}"

classRoster = [] # List of students
for number in range(25):
    newStudent = Student()
    classRoster.append(newStudent)
    print(newStudent.name)
</code>

Ihre Antwort auf die Frage