On 2020-11-14 at 10:09:32 +0100, Manfred Lotz <ml_n...@posteo.de> 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. Remember: (1) x += 1 behaves like x = x + 1, and (2) bindings created inside a class statement but outside any method create class attributes. So after counter0 = Main(), Main (the class) has an attribute called "value" whose value is 0, and counter0.value refers to that attribute. Then counter0.count() executes self.value += 1, which behaves like self.value = self.value + 1. The right side of that assignment evaluates to 1 (the value of the class attribute plus the constant 1), and then the assignment statement initializes self.value to *that* value. There's nothing special about initializing instance attributes in __init__. An instance attribute can be created/initialized anywhere. HTH, Dan -- https://mail.python.org/mailman/listinfo/python-list