Class Definitions

Terry Reedy tjreedy at udel.edu
Sat Nov 14 06:16:05 EST 2020


On 11/14/2020 4:09 AM, Manfred Lotz wrote:
> On 11 Nov 2020 19:21:57 GMT
> ram at zedat.fu-berlin.de (Stefan Ram) wrote:
> 
>>    In my Python course I gave the assignment to define a
>>    counter class "Main" so that
>>
>> counter0 = Main()
>> counter1 = Main()
>> counter1.count(); counter1.count(); counter1.count()
>> counter1.count(); counter1.count()
>> print( counter0.value )
>> print( counter1.value )
>>
>>    would print
>>
>> 0
>> 5
>>
>>    .
>>
>>    I expected this solution:
>>
>> class Main:
>>      def __init__( self ):
>>          self.value = 0
>>      def count( self ):
>>          self.value += 1
>>
>>    but a student turned in the following solution:
>>
>> class Main:
>>      value = 0
>>      def count(self):
>>          self.value += 1
>>
>>    .
> 
> I am still a Python beginner and didn't even believe that the student's
> solution would work. I had expected an error as the instance variable
> self.value was not initialized.

It was not.  But self.x as a value, rather than a target, first looks 
for instance x, then class x, then superclass x, up to object.x.  Such 
lookup is routine for methods, much rarer for data.

self.value += 1 is roughly equivalent to
self.value = self.value +1 where the right self.value is Main.value. 
'self' is only looked up once, but apparently the value attribute is 
looked up twice, in spite of what one might think from the doc, so that 
the first assignment to self.value initializes an instance value rather 
than overwriting the class value.

-- 
Terry Jan Reedy



More information about the Python-list mailing list