【问题标题】:Counter variable for class类的计数器变量
【发布时间】:2012-04-17 19:40:57
【问题描述】:

我在运行这段代码时遇到问题。该类是具有 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)

我试图在我的Student 班级中使用这个 idCounter,这样我就可以将它作为学生姓名的一部分(这实际上是一个 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 放在 before、after、all 组合中,但我仍然收到 referenced before assignment 错误,你能解释一下我做错了什么吗?

【问题讨论】:

  • 你看过紧随其后的那一行了吗?
  • 为什么我没想到...(原来我的代码写了Student.idCounter = 0
  • 除了特定的错误之外,增量在 Python 中不是原子的,因此天真的计数器可能会导致竞争条件。更好的方法是使用itertools.count
  • 使用您的示例here对您的问题发布了后续问题

标签: python class-variables


【解决方案1】:

类变量必须通过类名访问,在本例中为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 想通了...

【讨论】:

  • 另外,请注意您的第一条评论非常不准确。
  • 是的,实际上它只是一个计数器,没有别的。 (真的不知道该评论什么,也许应该一起删除评论)。非常感谢 Ignacio Vazquez-Abrams。
【解决方案2】:

不久前得到这个答案帮助我找到了分类类与实例变量及其作用域所需的内容。 所以,一个扩展,它做同样的事情,只使用一个生成器。生成器像 idCounter 一样为学生分配一个唯一编号——只有它使用这些值。我知道生成器类上没有 prev 方法。 idGenerator 和 idCounter 都没有被记忆,所以如果你想外部化列表然后回来添加一个或多个学生,你必须相应地更新范围(开始,,),或者迭代每个值而不分配它,直到你依次到达唯一的一个,使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2019-07-10
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多