Search code examples
pythonoopclass-design

How do I design this procedural code as class based (object oriented)?


I'm a beginner-intermediate self taught Python developer,

In most of the projects I completed, I can see the following procedure repeats. I don't have any outside home code experiences, I think the below code is not so professional as it is not reusable, and seems like it is not fitting all together in a container, but loosely coupled functions on different modules.

def get_query():
    # returns the query string
    pass

def make_request(query):
    # makes and returns the request with query
    pass

def make_api_call(request):
    # calls the api and returns response
    pass

def process_response(response):
    # process the response and returns the details
    pass

def populate_database(details):
    # populates the database with the details and returns the status of population
    pass

def log_status(status):
    # logs the status so that developer knows whats happening
    pass

query = get_query()
request = make_request(query)
response = make_api_call(request)
details = process_response(response)
status = populate_database(details)
log_status(status)

How do I design this procedure as a class based design?


Solution

  • If I understand correctly, you want these group of functions to be reused. Good approach to this would be create Abstract base class with these methods as shown below:

    from abc import ABCMeta
    
    class Generic(object):
    __metaclass__  = ABCMeta
    
    
        def get_query(self):
            # returns the query string
            pass
    
        def make_request(self, query):
            # makes and returns the request with query
            pass
    
        def make_api_call(self, request):
            # calls the api and returns response
            pass
    
        def process_response(self, response):
            # process the response and returns the details
            pass
    
        def populate_database(self, details):
            # populates the database with the details and returns the status of population
            pass
    
        def log_status(self, status):
            # logs the status so that developer knows whats happening
            pass
    

    Now whenever you need to use any of these methods in your project, inherit your class from this abstract class.

    class SampleUsage(Generic):
    
        def process_data(self):
            # In any of your methods you can call these generic functions
            self.get_query()
    

    And then you can create object to actually get results which you want.

    obj = SampleUsage()
    obj.process_data()