Let us create an empty Student class.
>>> class Student:
... pass
...
>>>
>>> Student
<class '__main__.Student'>
Now , we can create instances for this Student class .
>>> S1 = Student()
>>> S2 = Student()
>>>
>>> print(S1)
<__main__.Student object at 0x7fc3b3396b80>
>>> print(S2)
<__main__.Student object at 0x7fc3b1dfefd0>
>>>
S1 and S2 are two different objects of same class .
We can initialized some instance variables for S1 and S2.
>>> S1.Name = "JOHN"
>>> S1.Age = 17
>>>
>>> S2.Name = "PETER"
>>> S2.Age = 18
>>>
>>> print(S1.Name)
JOHN
>>> print(S2.Name)
PETER
>>>
Similarly , we can create various student objects and initialized the value of name and age for them .
But as the number of student increases the above process of initializing variables will become a difficult task and more prone to errors.
To resolve this issue , the constructor came into play .