web-dev-qa-db-ja.com

クラスのカウンター変数

このコードを実行するのに問題があります。クラスはIdCounterを持っているStudentで、問題があるようです。 (8行目)

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)

このidCounterをStudentクラス内に配置しようとしているので、学生の名前(実際にはID#、たとえばStudent 12345)の一部として使用できます。しかし、エラーが発生しています。 。

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

IdCounter + = 1をすべての組み合わせの前、後、に入れようとしましたが、それでもreferenced before assignmentエラーが発生します。私が間違っていることを説明してもらえますか?

18
George
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)

Ignacio、Vazquez-Abramsによる指摘のおかげで、それを理解しました...

31
George

少し前にこの回答にたどり着いたことで、クラス変数とインスタンス変数、およびそれらのスコープを分類するために必要なものを見つけることができました。したがって、ジェネレーターのみを使用して同じことを行う拡張機能。ジェネレータは、idCounterと同様に、学生に一意の番号を割り当てます。値を消費するのはジェネレータだけです。私が知っているジェネレータクラスにはprevメソッドはありません。 idGeneratorもidCounterもメモ化されていないため、リストを外部化してから戻って1人以上の生徒を追加する場合は、それに応じて範囲(start 、、)を更新するか、各値を割り当てずに繰り返す必要があります。一意のパスに順番に到達します。idCounterを使用するとパスがやや短くなり、単一のダミーインスタンスコンストラクトを使用して設定するだけです。

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)
1
Tim Pozza