Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Counter variable for class

Tags:

I am having problem getting this piece of code to run. The class is Student which has a IdCounter, and it is where the problem seems to be. (at line 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) 

I am trying to have this idCounter inside my Student class, so I can have it as part of the student's name (which is really an ID#, for example Student 12345. But I have been getting error.

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 

I tried to put the idCounter += 1 in before, after, all combination, but I am still getting the referenced before assignment error, can you explain to me what I am doing wrong?

like image 483
George Avatar asked Apr 04 '12 05:04

George


People also ask

What is counter variable with example?

A counter variable in Java is a special type of variable which is used in the loop to count the repetitions or to know about in which repetition we are in. In simple words, a counter variable is a variable that keeps track of the number of times a specific piece of code is executed.

How do you counter a variable in Python?

To count objects, you typically use a counter, which is an integer variable with an initial value of zero. Then you increment the counter to reflect the number of times a given object appears in the input data source. When you're counting the occurrences of a single object, you can use a single counter.


2 Answers

The class variable has to be accessed via the class name, in this example 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) 

Thanks to the point out by Ignacio, Vazquez-Abrams, figured it out...

like image 61
George Avatar answered Sep 30 '22 10:09

George


Coming to this answer some time ago helped me find what I needed to sort out class versus instance variables and their scoping. So, an extension, which does the same thing, only using a generator. The generator assigns a unique number to the student as idCounter does -- only it consumes the values. There is no prev method on the generator class, of which I'm aware. Neither idGenerator nor idCounter is memoized, so if you want to externalize the list then come back to add one or more students, you'd have to update the range(start,,) accordingly, or iterate through each value without assigning it until you arrive at the unique one in sequence, a path somewhat shorter with idCounter which you cou simply set with a single dummy instance construct and go.

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) 
like image 33
Tim Pozza Avatar answered Sep 30 '22 10:09

Tim Pozza