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?
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
i = 1 would be run in the local scope, but i += 1 just raises an errorself, so it's not an error.The class attribute is initialized the first time you use the ClassName in the source code, also you use the class attribute in the code by doing ClassMethod.attribute
class Foo:
i = 1 # initialization
def __init__(self):
#Use ClassName.attribute to access class attribute
Foo.i += 1
#I used the Name of the class here, Foo.i will be 1
print(Foo.i)
#1
#Instantiated Foo
t = Foo()
#Value of i changes to 2
print(t.i)
#2
static class attribute instead?static
Foo.iprior to instantiation.