Consider the following code
class Foo:
i = 1 # initialization
def __init__(self):
self.i += 1
t = Foo()
print(t.i)
When exactly does the initialization of i take place? Before the execution of the init method or after it?
Advertisement
Answer
Before.
The __init__ method isn’t run until Foo is instantiated. i=1 is run whenever the class definition is encountered in the code
You can see this by adding print statements:
print('Before Foo')
class Foo:
i = 1
print(f'Foo.i is now {i}')
def __init__(self):
print('Inside __init__')
self.i += 1
print(f'i is now {self.i}')
print('After Foo')
print('Before __init__')
foo = Foo()
print('After __init__')
which prints:
Before Foo Foo.i is now 1 After Foo Before __init__ Inside __init__ i is now 2 After __init__
Notice however, that your self.i += 1 does not modify the class attribute Foo.i.
foo.i # This is 2 Foo.i # This is 1