OOP in Python | Set 3 (Inheritance, examples of object, issubclass and super) (original) (raw)

Last Updated : 07 Jun, 2022

We have discussed following topics on Object Oriented Programming in Python

In this article, Inheritance is introduced. One of the major advantages of Object Oriented Programming is re-use. Inheritance is one of the mechanisms to achieve the same. In inheritance, a class (usually called superclass) is inherited by another class (usually called subclass). The subclass adds some attributes to superclass. Below is a sample Python program to show how inheritance is implemented in Python.

Python `

A Python program to demonstrate inheritance

Base or Super class. Note object in bracket.

(Generally, object is made ancestor of all classes)

In Python 3.x "class Person" is

equivalent to "class Person(object)"

class Person(object):

# Constructor
def __init__(self, name):
    self.name = name

# To get name
def getName(self):
    return self.name

# To check if this person is employee
def isEmployee(self):
    return False

Inherited or Sub class (Note Person in bracket)

class Employee(Person):

# Here we return true
def isEmployee(self):
    return True

Driver code

emp = Person("Geek1") # An Object of Person print(emp.getName(), emp.isEmployee())

emp = Employee("Geek2") # An Object of Employee print(emp.getName(), emp.isEmployee())

`

Output:

('Geek1', False) ('Geek2', True)

**How to check if a class is subclass of another?**Python provides a function issubclass() that directly tells us if a class is subclass of another class.

Python `

Python example to check if a class is

subclass of another

class Base(object): pass # Empty Class

class Derived(Base): pass # Empty Class

Driver Code

print(issubclass(Derived, Base)) print(issubclass(Base, Derived))

d = Derived() b = Base()

b is not an instance of Derived

print(isinstance(b, Derived))

But d is an instance of Base

print(isinstance(d, Base))

`

Output:

True False False True

**What is object class?**Like Java Object class, in Python (from version 3.x), object is root of all classes. In Python 3.x, "class Test(object)" and "class Test" are same. In Python 2.x, "class Test(object)" creates a class with object as parent (called new style class) and "class Test" creates old style class (without object parent). Refer this for more details.**Does Python support Multiple Inheritance?**Unlike Java and like C++, Python supports multiple inheritance. We specify all parent classes as comma separated list in bracket.

Python `

Python example to show working of multiple

inheritance

class Base1(object): def init(self): self.str1 = "Geek1" print "Base1"

class Base2(object): def init(self): self.str2 = "Geek2"
print "Base2"

class Derived(Base1, Base2): def init(self):

    # Calling constructors of Base1
    # and Base2 classes
    Base1.__init__(self)
    Base2.__init__(self)
    print "Derived"
    
def printStrs(self):
    print(self.str1, self.str2)
   

ob = Derived() ob.printStrs()

`

Output:

Base1 Base2 Derived ('Geek1', 'Geek2')

How to access parent members in a subclass?

  1. Using Parent class name Python `

Python example to show that base

class members can be accessed in

derived class using base class name

class Base(object):
# Constructor
def init(self, x):
self.x = x
class Derived(Base):
# Constructor
def init(self, x, y):
Base.x = x
self.y = y
def printXY(self):

   # print(self.x, self.y) will also work  
   print(Base.x, self.y)  

Driver Code

d = Derived(10, 20)
d.printXY()
2. **Using super()**We can also access parent class members using super. Python

Python example to show that base

class members can be accessed in

derived class using super()

class Base(object):
# Constructor
def init(self, x):
self.x = x
class Derived(Base):
# Constructor
def init(self, x, y):

    ''' In Python 3.x, "super().__init__(name)"  
        also works'''  
    super(Derived, self).__init__(x)  
    self.y = y  
def printXY(self):  
   # Note that Base.x won't work here  
   # because super() is used in constructor  
   print(self.x, self.y)  

Driver Code

d = Derived(10, 20)
d.printXY()
` Note that the above two methods are not exactly the same. In the next article on inheritance, we will covering following topics. 1) How super works? How accessing a member through super and parent class name are different? 2) How Diamond problem is handled in Python?**Exercise:**Predict the output of following Python programs

  1. Python `

class X(object):
def init(self, a):
self.num = a
def doubleup(self):
self.num *= 2
class Y(X):
def init(self, a):
X.init(self, a)
def tripleup(self):
self.num *= 3
obj = Y(4)
print(obj.num)
obj.doubleup()
print(obj.num)
obj.tripleup()
print(obj.num)
2. Python

Base or Super class

class Person(object):
def init(self, name):
self.name = name

   def getName(self):  
       return self.name  
     
   def isEmployee(self):  
       return False  

Inherited or Subclass (Note Person in bracket)

class Employee(Person):
def init(self, name, eid):
''' In Python 3.0+, "super().init(name)"
also works'''
super(Employee, self).init(name)
self.empID = eid

   def isEmployee(self):  
       return True  
         
   def getID(self):  
       return self.empID  

Driver code

emp = Employee("Geek1", "E101")
print(emp.getName(), emp.isEmployee(), emp.getID())
`
Output:
('Geek1', True, 'E101')