title: Creating objects of derived class in base class - python
body: <p>I have an abstract class called IDataStream and it has one method. I create two implementations for this abstract class called IMUDataStream, GPSDataStream. In future there is a possibility that I may add another implementation of IDataStream abstract class. I have another class called DataVisualizer that visualizes all the data pulled by different DataStream classes. </p>
  
  <p>In future if I add another DataStream implementation of the IDataStream abstract class, I should not be modifying the DataVisualizer class to visualize the data. Is there a way to create objects of all the derived classes of the IDataStream class, add it to a list and iterate through the list and use it to call the methods that will give me the data ? </p>
  
  <p>Please note that I'm new to python and design patterns. Trying to learn. This may be a complete dumb question and total madness. I actually have a requirement for this. If this can be achieved through a design pattern I request the reader to point me to the material. Help much appreciated. Thanks !</p>
  
  <pre><code>#!/usr/bin/env python3
  
  from abc import ABC, abstractmethod
  
  class IDataStream(ABC):
      def get_data(self):
          pass           
  
  class IMUDataStream(IDataStream):
      def __init__(self):
          self.__text = "this is IMU data"
  
      def get_data(self):
          print(self.__text)
  
  class GPSDataStream(IDataStream):
      def __init__(self):
          self.__text = "this is GPS data"
  
      def get_data(self):
          print(self.__text)
  
  class DataVisualizer:
      def __init__(self):
          # somehow create objects of all derived classes of IDataStream here and call the get_data() function
          # even if I add another derived class in the future. I should not be modifying the code here
  </code></pre>