I am learning python via dive into python. Got few questions and unable to understand, even through the documentation.
1) BaseClass
2) InheritClass
What exactly happens when we assign a InheritClass instance to a variable, when the InheritClass doesn't contain an __init__ method and BaseClass does ?
- Is the BaseClass
__init__method called automatically - Also, tell me other things that happen under the hood.
Actually the fileInfo.py example is giving me serious headache, i am just unable to understand as to how the things are working. Following
2 Answers 2
Yes, BaseClass.__init__ will be called automatically. Same goes for any other methods defined in the parent class but not the child class. Observe:
>>> class Parent(object):
... def __init__(self):
... print 'Parent.__init__'
... def func(self, x):
... print x
...
>>> class Child(Parent):
... pass
...
>>> x = Child()
Parent.__init__
>>> x.func(1)
1
The child inherits its parent's methods. It can override them, but it doesn't have to.
8 Comments
child.func will call func in the parent class if it does not exist in the child class.Child, there is a implicit call to the __init__ method of Child, which is inherited whenever it is not explicitly defined.Parent.__init__ in the Child.__init__ method, you need to pass the child instance self as follows: class Child(Parent): def __init__(self): Parent.__init__(self) #other child stuffchild.func method, but you want to call the parent.func method, with an instance c of Child, then you need to call func as an unbound method, explicitly passing in the instance: Parent.func(c). Normally, when you call func as a bound method to an instance c as c.func() this is converted to Child.func(c), where c is the instance self in the method definition. If this seems confusing, keep in mind that typically overriding an inherited method is indication that the child class will not want access to the parents method.__init__ method is the most common exception to this, where you are likely to want the setup accomplished in the parents __init__ along with some custom setup for the child.@FogleBird has already answered your question, but I wanted to add something and can't comment on his post:
You may also want to look at the super function. It's a way to call a parent's method from inside a child. It's helpful when you want to extend a method, for example:
class ParentClass(object):
def __init__(self, x):
self.x = x
class ChildClass(ParentClass):
def __init__(self, x, y):
self.y = y
super(ChildClass, self).__init__(x)
This can of course encompass methods that are a lot more complicated, not the __init__ method or even a method by the same name!