24

このコードを実行するのに問題があります。クラスは 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エラーが発生しています。何が間違っているのか説明してもらえますか?

4

2 に答える 2

41

この例では、クラス変数はクラス名を介してアクセスする必要がありますStudend.idCounter

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 はそれを理解しました...

于 2012-04-04T05:31:52.487 に答える
1

少し前にこの回答にたどり着いたことで、クラス変数とインスタンス変数、およびそれらのスコープを整理するために必要なものを見つけることができました。したがって、ジェネレータのみを使用して同じことを行う拡張機能です。ジェネレーターは、idCounter が行うように学生に一意の番号を割り当てますが、値を消費するだけです。私が知っているジェネレータークラスにはprevメソッドはありません。idGenerator も idCounter もメモ化されていないため、リストを外部化してから戻って 1 人以上の学生を追加する場合は、それに応じて range(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)
于 2018-07-12T22:59:54.587 に答える