On 11/14/2020 4:09 AM, Manfred Lotz wrote:
On 11 Nov 2020 19:21:57 GMT
r...@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

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to