このコードを実行するのに問題があります。クラスは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
エラーが発生します。私が間違っていることを説明してもらえますか?
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による指摘のおかげで、それを理解しました...
少し前にこの回答にたどり着いたことで、クラス変数とインスタンス変数、およびそれらのスコープを分類するために必要なものを見つけることができました。したがって、ジェネレーターのみを使用して同じことを行う拡張機能。ジェネレータは、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)