In object-oriented programming, inheritance allows child classes to inherit and access attributes and methods from their parent classes.
This guide explains how to access parent class members (variables and methods) from within a child class in Python, using super() and direct access.
Accessing Parent Class Instance Variables
To access instance variables initialized in the parent class, you must call the parent's __init__ method from within the child's __init__. The best way to do this is with super():
class Employee():
cls_id = 'emp-cls' # Class variable
def __init__(self, name):
self.salary = 100 # Instance variable
self.name = name # Instance variable
class Developer(Employee):
def __init__(self, name):
super().__init__(name) # Call parent's __init__
print(self.salary) # Output: 100
print(self.name) # Output: tomnolan
d1 = Developer('tomnolan')
print(d1.salary) # Output: 100- The
super().__init__(name)line calls the parent class's constructor (__init__method). - This initializes the instance variables defined in the
Employeeclass (self.salaryandself.name), making them accessible to theDeveloperinstance.
Accessing Parent Class Variables (Class-Level Attributes)
Class variables (attributes defined directly within the class, outside of any method) are accessible directly on the instance or on the class itself.
class Employee():
cls_id = 'emp-cls' # Class variable
class Developer(Employee):
def __init__(self, name):
print(self.cls_id) # Accessing parent class variable using self
print(Developer.cls_id) # Accessing parent class variable using class
d1 = Developer('tomnolan') # Output: emp-cls
print(d1.cls_id) # Output: emp-cls (accessing through instance)
print(Developer.cls_id) # Output: emp-cls (accessing through class)- Class variables are shared among all instances of the class and its subclasses.
Accessing Parent Class Methods
To call methods defined in the parent class, you can use super() again:
class Employee():
def __init__(self, name):
self.name = name
self.salary = 100
def greet(self):
print(f'Hello {self.name}')
class Developer(Employee):
def __init__(self, name):
super().__init__(name)
print(self.salary)
self.greet() # Call parent's method
d1 = Developer('tomnolan')
print(d1.salary) # Output: 100
d1.greet() # Output: Hello tomnolanOutput:
100
Hello tomnolan
100
Hello tomnolan- Within the
Developerclass,self.greet()calls thegreetmethod defined in theEmployeeclass.selfis automatically passed to the parent's method.
Getting the Name of a Parent Class
From the Child Class
To get the name(s) of the immediate parent class(es) from within the child class, use the __bases__ attribute of the class object.
class Person():
pass
class Employee(Person):
pass
class Developer(Employee):
def get_parent_class_names(self):
immediate_parents = self.__class__.__bases__
print(immediate_parents) # Output: (<class '__main__.Employee'>,)
for parent in immediate_parents:
print(parent.__name__) # Employee
d1 = Developer()
d1.get_parent_class_names()self.__class__.__bases__returns the parent of the current class, not an instance.
From an Instance of the Child Class
To get the parent class name from an instance of the child class:
class Person():
pass
class Employee(Person):
pass
class Developer(Employee):
pass
d1 = Developer()
immediate_parents = type(d1).__bases__
immediate_parents = d1.__class__.__bases__
print(immediate_parents) # Output: (<class '__main__.Employee'>,)
print(immediate_parents[0].__name__) # Output: Employeetype(d1)gets the class of the instance (which isDeveloper).. __bases__is then accessed on the class, not the instance, to retrieve a tuple of base classes.[0]accesses the first parent class (in this case, there's only one)..__name__gets the name of the class as a string.